2016-04-09 9 views
2

JavaがOutOfMemoryErrorをスローし、-XX:+HeapDumpOnOutOfMemoryErrorを使用してヒープダ​​ンプを取得するまで、データ構造にアイテムを意図的に追加しています。私は-Xmx100Mを使用していますので、ヒープダンプで約100MBのライブオブジェクトが表示されると予想しましたが、代わりに46MBしか表示されません。Javaヒープ・ダンプがヒープの半分しか表示しないのはなぜですか?

ライブオブジェクトが46MBしかない場合、Javaはなぜ100MBのヒープでOOMをスローしますか?

(私はこの質問に答えるために十分な情報を与えられていないが、私は、関連するだかわからないんだけど良いチャンスがあるの実現、必要に応じてより多くの情報を追加することが幸せ。。)

EDIT:最後の-verbose:gc出力:

[Full GC (Ergonomics) [PSYoungGen: 1056K->64K(2560K)] [ParOldGen: 7116K->7116K(7168K)] 8173K->7180K(9728K), [Metaspace: 5981K->5981K(1056768K)], 0.0071141 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 64K->0K(2560K)] [ParOldGen: 7116K->7075K(7168K)] 7180K->7075K(9728K), [Metaspace: 5981K->5974K(1056768K)], 0.0190392 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
java.lang.OutOfMemoryError: Java heap space 
+0

見ることができます。実際のエラーは何ですか? –

+0

こんにちはPeter。これは次のとおりです: 'スレッド内の例外" main "java.lang.OutOfMemoryError:Javaヒープスペース \t at java.util.Arrays.copyOf(Arrays.java:3308)' – Doradus

+0

大きな配列を生成できない場合は、その配列のないダンプ・ダンプ。最近、100 MBは小さなヒープですが、あなたはそれが小さいことが必要ですか? –

答えて

4

ヒープは、若い世代と古い世代の2つのセクションに分割されています。たとえば、OOMを取得します。古い世代は、若い世代から古い世代(そしておそらく他の世代)にオブジェクトを宣伝することが不可能なように、完全または断片化されています。

たとえば、 -verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log各世代のサイズが表示されます。

あなたは、ヒープ領域の不足を含む多数の理由OutOfMemoryErrorsを得ることができますどのようにここにチューニング世代のサイズをhttps://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

+0

リンクありがとう!私は彼らが私のようなストレスシナリオで若い世代を自動的に縮小すると思っていたでしょう。 '-XX:NewRatio = 50'や' -XX:MaxNewSize = 1M'を設定すると、ヒープダンプに90MB以上のライブオブジェクトが残ってしまいます。 – Doradus

関連する問題