2013-10-17 18 views
1

我使用下面的實現來測試Java對象的內存消耗。
但是,當調用方法的for循環中i限制從384到1694時,它將打印用法爲104936 B
它打印用法0B爲當上述我限值小於384在java中測試對象內存消耗的實現結果困惑

這是爲什麼?

  • IDE:Eclipse的開普勒
  • 的java:1.5(此行爲不同,當 Java版本也改變)
  • 操作系統:Ubuntu的12.10

    public static void main(String[] args) { 
    
        Runtime runtime  = Runtime.getRuntime(); 
    
        long totalStart  = runtime.totalMemory(); 
        long start   = runtime.freeMemory(); 
    
        SampleTester sampleTester = new SampleTester(); 
        sampleTester.callingMethod(); 
    
        long totalEnd  = runtime.totalMemory(); 
        long end   = runtime.freeMemory(); 
    
        System.out.println("Usage [(("+totalEnd+"-"+end+") - ("+totalStart+"-"+start+"))] \t: " + ((totalEnd-end) - (totalStart-start))); 
    
    } 
    
    private void callingMethod(){ 
    
        for(int i = 0; i < 1694; i++){ 
    
         ArrayList<String> arrayList = new ArrayList<String>(); 
    
        } 
    } 
    
+1

可能重複[什麼是Java中的對象的內存消耗?](http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in- JAVA) – RamonBoza

回答

4

每個ArrayList你在當前循環迭代結束時立即創建

所以理論上的JVM可在以前由一個從最後一次迭代佔用的空間分配每個ArrayList和只需要一個「時隙」,當最後迭代結束,並且該方法存在它獲取丟棄。

這解釋了「0」值(這個或類似的優化)。

在實踐中,JVM並不總是這樣做,但會使合格對象在一段時間內未被收集,以便更高性能(因爲GC過於頻繁可能會影響性能)。

如何的JVM決定要應用的優化,完全實現定義和了解非常細節是很少有用的信息(因爲你不能依賴它,它可以用下一個改變版)。

所以,如果你想找出多少內存ňArrayList對象的需要,確保您的每一個實際上是可達,因此不是當您檢查當前使用符合垃圾收集記憶。