-Xmx1024m でいくつかの Java コードを開始すると、ある時点で OOM が原因で hprof が発生します。hprof には 320MB しか表示されず、スタック トレースが表示されます。
at java.util.Arrays.copyOfRange([CII)[C (Arrays.java:3209)
at java.lang.String.<init>([CII)V (String.java:215)
at java.lang.StringBuilder.toString()Ljava/lang/String; (StringBuilder.java:430)
...
これは、私がコピーしている大きな文字列から来ています。
私はどこかで読んだことを覚えています(どこで見つけられませんでした)何が起こったのか、これらのケースは次のとおりです。
- プロセスはまだ 1 GB のメモリを消費していません。
- ヒープがまだ 1 GB 未満であっても、ある程度のメモリが必要であり、
copyOfRange()
連続メモリでなければならないため、まだ制限を超えていなくても、ホスト上で十分な大きさのメモリを見つけることができず、失敗します。 OOM。
これに関するドキュメントを探してみましたが(copyOfRange()
連続メモリのブロックが必要です)、何も見つかりませんでした。
もう 1 つの考えられる原因は、十分な permgen メモリがないことです。
誰かが連続記憶仮説を確認または反論できますか? 一部のドキュメントへのポインタも役立ちます。