0

私は-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=50Dsun.rmi.dgc.server.gcInterval=43200000 -Dsun.rmi.dgc.client.gcInterval=43200000ヒープダンプ分析 -

のGC間隔として設定GCとmaxmimumヒープサイズ-Xms4096m -Xmx4096m -Xmn1024mの4回のギグを持つアプリケーションを実行しているのOutOfMemory例外の根本的な原因を探すには、突然、私のアプリケーションは、メモリ不足にヒープに行きました例外と私は同じ機会にスレッドダンプとヒープダンプを取った。スレッドダンプを解析すると、hashMapとarrayListに値が生成されるためスレッドが停止します。 ByteArrayOutStreamはスレッドのいずれかにロックを作成しました。

eclipseメモリアナライザツールでヒープダンプを分析すると、bytearrayオブジェクトがヒープのほぼ1ギグを占めていることが明らかです。 GCViewerから、それは秒の小数部にピークを有することが示される。私はなぜ突然バイト配列オブジェクトがスペースの1ギグを使用したのか分かりません。何人かが私を助けて犯人を絞ることができますか?

- アプリケーションサーバー - ヒープは日食メモリ分析ツールでダンプ分析上のWebLogic 12cを

+0

提供された情報で何かを言うのは難しいです。消費しているメモリコードの詳細を表示できますか? – Minh

+0

バイト配列であることがわかっても、あまり役に立ちません。何が問題になったのかの手掛かりを得るためには、アプリケーションのどのオブジェクトが配列を使用しているかを調べなければなりません。 MATでは、階層を包含オブジェクトに移動することができます。 –

+0

多くのコードの詳細が役に立つでしょう。提供されたjvmフラグを使用してデフォルトのアプリケーションを実行すると、何も複製されません。 –

答えて

0

、それは明らかに、オブジェクトがヒープのほぼ1ギグを占有していたByteArray言います。

MATのGCルート機能への最短パスを使用して、どの参照がそのバイト配列に保持されているかを確認します。

+0

私はMergerを試しました。参照を示さない。私はDominatorツリーを試してみましたが、メモリアドレス "0x74d407870"とバイト[]の特定の値を持つbyt配列objcetを表示します。これ以外の方法はありますか? – Arun

+0

オブジェクトがOOMEによって割り当てられた後に到達不能になる可能性があります。大規模なものをByteArrayOutStreamに直列化しようとしているかもしれません。これはもちろん、使用されるまでメモリに保持されます。 – the8472

+0

あなたは正しいです。オブジェクトをシリアル化しようとしています。 JVisualVMから、この参照(Javaフレーム) - value:byte []#65581(1,073,790,734 items) < - buf(Javaフレーム) - クラス:java.io.ByteArrayOutputStream、value:byte [] #65581(1,073,790,734 items) < - out(Javaフレーム) - クラス:java.io.ObjectOutputStream $ BlockDataOutputStream、値:java.io.ByteArrayOutputStream#12 < - bout(Javaフレーム) - クラス:com.terracotta.toolkit .object.serialization.SerializationStrategyImpl $ SerializerObjectOutputStream、値:java.io.ObjectOutputStream $ BlockDataOutputStream#13' – Arun