1

最近の Java のインタビューで、この質問をされました。OutOfMemory Exception を取得した場合、どのクラスとどのメソッドが OutOfMemory Exception をスローしたかを調べるにはどうすればよいでしょうか。私はそれがスタックトレースに来ると答えましたが、彼は多くの場合、どの特定のメソッド/クラスがその例外をスローしたかを教えてくれないと言っていました. 彼は、役立つツールまたは JVM の引数を期待していたと思います。でも使ったことがないので答えられません。

無限ループでハッシュマップに値を入れる簡単な例を試しました。しばらくすると OutOfMemory エラーが発生し、クラス/メソッド名と行番号が表示されます。これらの詳細 [メソッド/クラス名] が得られないシナリオと、それを見つけるために使用できるツール/VM 引数を理解したいと思います。

**Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at hashmapTest.main(hashmapTest.java:18)**

この VM 引数 Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath についても読みましたが、この目的を達成するために使用されているかどうかはよくわかりません。

4

1 に答える 1

0

Java がヒープ領域を使い果たしている場合、それが独自のオブジェクトの 1 つである場合、どの特定のオブジェクトが例外をスローしているかを確認できますが、それは低レベルの遅延内部作業を実行している内部 Java オブジェクトである可能性が非常に高いです。トレースがあまり役に立たない場合。

Xms オプションは許可される最大ヒープ サイズを定義し、Xms オプションは最小ヒープ サイズを定義するため、メモリ リーク/オーバーヘッドの問題でない場合は、問題を解決する必要があります。

プログラムが必要以上に多くのメモリを使用していると思われる場合は、メモリ使用量を追跡するためのツールがいくつかあります。

于 2013-04-08T09:56:06.810 に答える