2015-10-03 69 views
0

我在Eclipse中執行以下代碼使用freeMemory方法獲取對象大小:無法在運行時

public static void main(String args[]) { 
    long before=Runtime.getRuntime().freeMemory(); 
    Object o=new Object(); 

    Long after=Runtime.getRuntime().freeMemory(); 
    System.out.println(before-after); 
} 

但我發現了輸出爲0 我試圖找出爲什麼freeMemory方法是不降低對象創建後堆空間?

+0

可能重複的[運行時 - 爲什麼是freeMemory()沒有顯示內存消耗正確?](http://stackoverflow.com/questions/3421869/runtime-why-is-freememory-not-showing-memory-consumed-正確) – Roman

回答

0

來衡量你應該使用jol對象大小。

0

Java/JVM是一種垃圾收集語言。內存分配和釋放完全由垃圾收集器管理,當JVM通過年輕一代垃圾收集或完全垃圾收集時,會發生這樣的內存釋放。它再次基於GC類型,如串行GC,並行GC等。

此外: 當JVM找到freeMemory()方法時,它只返回一個值,表示新的對象有多少JVM空閒內存可用被分配但不是呼叫釋放或釋放內存。

因此,freeMemory()方法在查看對象並釋放它們時沒有任何影響。另外,在垃圾收集語言中,您無法直接釋放任何特定對象的內存,但它只會通過垃圾收集調用發生。此外,某些類型的JVM(如CMS收集器)會標記要在其下一個垃圾收集週期(年輕GC)中釋放的對象,前提是您的對象不是在收集之前被提升爲舊一代的終身對象。這種GC中的實際內存釋放發生在掃描階段。閱讀有關垃圾收集器類型的更多信息,如串行GC,並行GC,CMS,G1GC,只有這樣您才能瞭解特定條件和JVM初始化設置 - 您可以期待垃圾收集調用和垃圾收集類型(年輕收集或完整GC收集)被觸發,釋放分配的內存。