2014-02-20 32 views
2

我正在創建我的課程的一個4096 x 4096數組。當我分析時,它顯示char數組使用的內存最多。我的班級中沒有任何字符數組或字符串。JVM監視器字符數組內存使用情況

這裏是我的Java類:

public class MyClass { 
    private int id; 
    private boolean flag; 


    public MyClass() { 
     id = 0; 
     flag = false; 
    } 
} 

而我的主類:

public class Main { 

    public static void main(String[] args) { 
     MyClass[][] objects = new MyClass[4096][4096]; 

     for (int i = 0;i<4096;i++) { 
      for(int j = 0;j<4096;j++) { 
       objects[i][j] = new MyClass(); 
      } 
     } 

     while(true); 
    } 
} 

我使用JVM監視器分析。爲什麼要顯示這個?

下面是在Eclipse中運行它的屏幕截圖:

Screenshot of Eclipse profile

+0

你是如何執行堆轉儲的?你是否在前面運行GC來清除所有垃圾? –

+0

你的主要方法從哪個類運行? – Yogesh

回答

2

從您的圖像看來,您創建的MyClass的實例在進行分析時甚至沒有生效。由於char數組返回String s,所以char[]的用法是預期的,因爲char類被廣泛用於類定義等。

可能是因爲未使用數組而被垃圾收集。嘗試在使用該陣列的睡眠之後添加一行,然後嘗試再次進行配置文件。示例:

MyClass[][] objects = new MyClass[4096][4096]; 
    for(int i = 0;i<4096;i++) 
    { 
     for(int j = 0;j<4096;j++) 
     { 
      objects[i][j] = new MyClass(); 

     } 
    } 

    Thread.sleep(1000000); 
    System.out.println(objects[10][40]); 

這可確保數組在您有機會進行分析之前不符合垃圾回收的條件。

+0

啊,我明白了。是的,這是問題所在。 – user3332774

+0

@ user3332774分析器需要一些內存才能運行,特別是VisualVM在運行時會創建大量對象。 –

0

確保您運行的System.gc(),或者把你的堆轉儲前相似。否則你會看到許多不再在你的示例中被引用的對象。

+0

我更新了我的代碼。這是我的項目中唯一的代碼。 – user3332774

+0

將(true)替換爲:System.gc():Thread.sleep(100000);並再次採樣 –

+0

沒有變化:/ – user3332774