2017-03-06 51 views
1

我是編程的初學者,我試圖通過使用4種類型的鍵運行以下代碼來比較不同類型的GC。在OutOfMemoryError(Java)之前計算對象

public class User { 

    private String name; 
    private int age; 

    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); 
     System.out.println("Finalized."); 
    } 

    public static void showInfo() { 
     Runtime runtime = Runtime.getRuntime(); 
     System.out.println("##### Heap utilization statistics [bytes] #####"); 
     System.out.println("Used memory: " + (runtime.totalMemory() - runtime.freeMemory()) + " bytes"); 
     System.out.println("Free memory: " + runtime.freeMemory() + " bytes"); 
     System.out.println("Total memory: " + (runtime.totalMemory()) + " bytes"); 
     System.out.println("Max memory: " + (runtime.maxMemory()) + " bytes"); 
    } 

    public static void main(String[] args) { 
     int num = 0; 
     System.out.println("Start..."); 
     for (int i = 0; i < 54000; i++) { 
      num++; 
      new User("Bob", 25); 
     } 
     System.out.println("Objects created before error: " + num); 
     showInfo(); 
     System.out.println("Finish."); 
    } 
} 

鍵是(各自表示GC類型之一):

-XX:+UseSerialGC 
-XX:+UseParallelOldGC 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 

而我使用小3MB堆(-Xmx3mb)。

所以,問題是如何統計OutOfMemoryError(Java堆空間錯誤之前)創建的對象的數量?我的意思是在那個代碼中創建的對象的數量是54000,但是如果我試圖創建更多(70000,80000等),我有一個錯誤,並且不知道拋出異常的對象數目是多少。有沒有一種很好的方法來計算,我們可以在OutOfMemoryError之前創建多少個對象?

+0

你可以強制堆轉儲,然後用eclipse MAT來檢查。 – OldProgrammer

+0

你可以捕獲錯誤,然後輸出'num'? –

+0

@SteveSmith @SteveSmith如果你遇到內存不足的錯誤,你可能沒有額外的內存來執行進一步的操作 – xTrollxDudex

回答

0
public static void main(String[] args) { 
     int num = 0; 
     System.out.println("Start..."); 
     for (int i = 0; i < 54000; i++) { 
      try { 
       new User("Bob", 25); 
       num++; 
      } catch(OutOfMemoryError e) { 
       break; 
      } 
     } 
     System.out.println("Objects created before error: " + num); 
     showInfo(); 
     System.out.println("Finish."); 
    } 

您必須捕捉異常,並且只有在成功創建對象時才增加計數器。

+1

不應該創建一個OOME – njzk2

+0

你是什麼意思 – Mehdi

+2

@ njzk2:在這個特定的情況下,'User'具有一個自定義'finalize()'方法的事實是可能拋出的OutOfMemoryError的真正原因,因爲沒有保證終結器線程趕上分配速率,所以會有大量的對象掛在終止隊列中。當然,這樣的測試並沒有說明選擇的垃圾收集算法。 – Holger