1

-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 メモリがないことです。

誰かが連続記憶仮説を確認または反論できますか? 一部のドキュメントへのポインタも役立ちます。

4

1 に答える 1

2

コンカレント マーク スイープ コレクターを使用している場合、断片化が発生する可能性があります。ただし、新しいオブジェクトの場合、十分な若い世代のスペースがあれば、空き Eden スペースは常に連続しているため、断片化を心配する必要はありません。

多くのアプリケーションでは、ヒープのごく一部しか若い世代に割り当てられないため、断片化された Tenured スペースがあり、比較的小さなオブジェクト (最大メモリ サイズの 5% 程度) を作成すると、OutOfMemoryError が発生する可能性があります。

最大メモリ近くで実行するとパフォーマンスが非常に低下するため、アプリケーションで使用するメモリを減らすか、最大メモリを増やすことをお勧めします。これにより、世代のサイズも大きくなります。または、設定することもできます-XX:NewSize=512m

于 2011-11-29T09:46:59.803 に答える