2011-03-15 41 views

回答

1

你是怎麼測量的?

在我看來,該JVM將其權利範圍內很好地優化掉在TestClass1整數,因爲它從來沒有使用過,留下一個引用到一個空類

+0

使用下面的代碼來測量它, – adsk 2011-03-15 11:06:30

+0

但是這些成員可以被外部引用,因爲它們具有默認的包私人訪問修飾符。 – krock 2011-03-15 11:25:03

0
public class Sizer { 

    public static void main(String [] args) throws Exception { 
    Runtime r = Runtime.getRuntime(); 

    // Pre-instantiate variables 
    long memoryBefore = 0; 
    long memoryAfter = 0; 
    int loops = 10; 

    runGC(r, loops); 
    memoryBefore = getMemoryUsage(r); 

//  Long lo = new Long(1); 
    TestClass in = new TestClass(); 

    runGC(r, loops); 
    memoryAfter = getMemoryUsage(r); 

    System.out.println("Diff in size is " + (memoryAfter - memoryBefore)); 
    } 

    public static void runGC(Runtime r, int loops) throws Exception { 
    for(int i=0; i<loops; i++) { 
     r.gc(); 
     Thread.sleep(2000); 
    } 
    } 

    public static long getMemoryUsage(Runtime r) throws Exception { 
    long usedMemory = r.totalMemory() - r.freeMemory(); 
    System.out.println("Memory Usage: " + usedMemory); 
    return usedMemory; 
    } 

} 
+0

嗨,在堆棧上,你可以編輯你的文章。你可以考慮將這個問題轉移到這個問題上,以便更清晰。 – 2011-03-15 11:16:03

+0

不止一次運行完整GC不會執行任何操作(除非您有多個線程可以在同一時間分配) – bestsss 2011-03-15 11:16:46

+0

空閒內存的準確性通常僅在MB範圍內。即您可以分配多個對象並且不會更改可用內存。我建議你嘗試在一個數組中創建1000萬個,並看看它有多大的差異。 – 2011-03-15 11:20:05

2

行:

Integer r = 9; 

實際上變成:

Integer r = Integer.valueOf(9); 

由於自動裝箱,它檢索緩存整數OBJE克拉。如果您在Boxing Conversions上檢查JLS Section 5.1.7,則表明-128和127之間的整數值被緩存。實際上,第一次調用Integer.valueOf()(其中包含自動裝箱發生)將初始化可能佔用不同內存佔用量的高速緩存。

+1

在這種情況下,內存不會比TestClass1少嗎? – adsk 2011-03-15 11:09:40

+0

我已經擴展了我的答案,包括可能佔用內存中不同大小的整數高速緩存的初始化。 – krock 2011-03-15 11:26:09

1

Integer.valueOf它並不總是創建一個新的對象。這就是爲什麼內存分配不同

Integer r = 9; 
0

問:爲什麼類TestClass1的內存分配較少?

前面已經提到·克羅克的

Integer i = 9; 

將成爲

Integer i = Integer.valueOf(9); 

該指令造成高速緩存必須被初始化,然後才能使用它。

高速緩存包含-128至通常127的值,這給出255個必須初始化的值(new Integer(i))。這導致如此大的內存使用。

恢復指令

  • i = new Interger(9); - 將創建一個整數對象,
  • i = 9; - 將創建至少255個Integer對象和一個陣列。

僅供參考:緩存初始化不取決於裝箱值。當你將值設置爲低於-128且大於127時,緩存也被初始化。

+0

感謝krock和vash。 – adsk 2011-03-16 07:49:20

相關問題