2017-03-06 6 views
1

私はプログラミングの初心者です。以下のコードを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の前にいくつのオブジェクトを作成できるか、数えられるか?

+0

ヒープダンプを強制的に実行してから、eclipse MATを使って調べることができます。 – OldProgrammer

+0

エラーをキャッチして、 'num'を出力できますか? –

+0

@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'sの実際の原因ですファイナライザスレッドが割り振り速度に追いつくという保証はないので、ファイナンシゼーションキューにたくさんのオブジェクトがぶら下がります。もちろん、このようなテストでは、選択したガベージコレクションアルゴリズムについては何も言わない。 – Holger

関連する問題