簡體   English   中英

為什么一個空的Java程序會占用內存?

[英]Why does an empty Java program consume memory?

我正在探索Java中的內存使用情況,以了解為什么我的程序會泄漏內存。 在剝離我的主while循環中的代碼之后,隨着時間的推移,我仍然會增加內存使用量。 思考一個空程序的內存使用情況:

class Nothing
{    public static void main(String[] args)
     {    while(true);    }
}

我仍然看到內存增加了:

圖片說明在這里

所以我的問題是:為什么仍然有鋸齒形? 為什么在GC運行時不保存所有內存(每次gc運行(谷值),使用的內存增加10-20Kb(與前一個谷值相比))?

編輯:

Java版本“ 1.6.0_29”

Java(TM)SE運行時環境(內部版本1.6.0_29-b11)

Java HotSpot(TM)客戶端VM(內部版本20.4-b02,混合模式,共享)

操作系統:Windows 7 Enterprise-32 bit

為什么仍然有鋸齒形?

如果我沒記錯的話,部分原因是監視器本身正在強制應用程序創建包含有關垃圾回收狀態和內存使用情況信息的臨時對象。

為什么在GC運行時不保存所有內存(每次gc運行(谷值),使用的內存增加10-20Kb(與前一個谷值相比))?

我相信監視器在垃圾回收后不會立即看到已使用的內存量,而是必須經常輪詢以查看內存使用情況。 因此,感知到的“谷”一定要比真實谷高一些。 猜想谷底處內存使用量的增加只是這種差異的一個隨機產物,隨着時間的推移將被抵消。 (也就是說,我認為每個周期實際上不會發生10-20 KB的內存泄漏。)

這是探查器的工件,沒有探查器,就不會有分配。 不同的探查器會根據記錄數據的方式產生不同的工件。 在下面,您將看到什么配置文件,JProfiler Nothing會有:

在此處輸入圖片說明

鋸齒形圖案少得多。 但是,內存消耗也很小:

在此處輸入圖片說明

這是因為概要分析代理輪詢了java.lang.management.MemoryUsage JMX bean。 最終,這種消耗還將觸發垃圾回收。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM