3

Java アプリケーションでメモリ リークの原因を突き止めようとしています。GC サイクルが長いプロセスのヒープ ダンプを取得する必要があります。この場合、アプリがハングしていることとヒープが非常に大きいことが原因で、Jmap は機能しません。

残念ながら、jmap は取得したコア ダンプで UnknownOopException をスローします。GC中にコアダンプを取るのは正しくないと思います。コア ダンプの取得が正しい時点で Java プロセスを一時停止する方法はありますか?

それとも、他の問題が原因でコア ダンプが壊れてしまったのでしょうか?

4

3 に答える 3

2

GC の実行中にヒープ ダンプを取得することはできません。GC の前または後にヒープ ダンプを取得する必要があります。時間がかかる理由を知りたい場合は、どのフェーズに時間がかかっているかを判断すると便利です。これを確認して追加するには-verbosegc これは、安全なポイントに到達する、オブジェクトをコピーする、制限されたスペースをスキャンする、参照をチェックする、またはその他の処理に長い時間がかかっているかどうかを示します。

クリーンアップするオブジェクトがたくさんあるため、時間がかかる場合があります。推測では、2 GB のヒープ オブジェクトごとに最悪の場合で約 1 秒かかります。

于 2012-12-18T14:05:41.473 に答える
0

ヒープがいっぱいになり、GCがアプリケーションをロックする前に、ヒープダンプを取得する必要があります。

于 2012-12-18T14:04:13.133 に答える
0

私の経験では、OutOfMemory 例外または長い GC サイクルは、確実にメモリ リークを示すものではありません。

メモリ リークを検索するには、2 つの個別のヒープ ダンプをしばらく間隔をあけて取得し (jvisualvm を使用しましたが、最近ではバージョンが JDK にバンドルされています)、それらを分析します。ヒント: オブジェクトの保持サイズを検査すると役立ちます。

アプリケーションの動作に応じて、明らかなメモリ リークが発生しない場合は、JVM GC オプションを微調整するのが最善の策です。世代比率、新しいオブジェクトが保有された後の世代などを探します。

これが少し役立つことを願っています。

于 2012-12-18T14:06:01.523 に答える