私はプログラミングの初心者です。以下のコードを4種類のキーで実行することで、さまざまな種類のGCを比較しようとしています。OutOfMemoryError(Java)の前のオブジェクトをカウントする
-XX:+UseSerialGC
-XX:+UseParallelOldGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
そして、私は小さな3メガバイトのヒープ(-Xmx3mb
)を使用しています:
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タイプのいずれかを表している)です。
したがって、問題はOutOfMemoryError(Javaヒープスペースエラーの前)より前に作成されたオブジェクトの数をカウントする方法です。そのコードでは、作成されたオブジェクトの数は54000ですが、それ以上(70000,80000など)を作成しようとすると、エラーが発生し、オブジェクトの何番目の例外がスローされたのかわからなくなります。 OutOfMemoryErrorの前にいくつのオブジェクトを作成できるか、数えられるか?
ヒープダンプを強制的に実行してから、eclipse MATを使って調べることができます。 – OldProgrammer
エラーをキャッチして、 'num'を出力できますか? –
@SteveSmithメモリ不足のエラーが発生した場合、さらなる処理を実行するために必要な追加メモリがない可能性があります。 – xTrollxDudex