我是編程的初學者,我試圖通過使用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之前創建多少個對象?
你可以強制堆轉儲,然後用eclipse MAT來檢查。 – OldProgrammer
你可以捕獲錯誤,然後輸出'num'? –
@SteveSmith @SteveSmith如果你遇到內存不足的錯誤,你可能沒有額外的內存來執行進一步的操作 – xTrollxDudex