4

本番システムの1つでJVMのクラッシュを調査していますが、以下のhs_err_pidログファイルスニペットで次のメモリ値は何を表していますか?

Heap
 par new generation   total 1258624K, used 955445K [0x00000005c0000000, 0x00000006155b0000, 0x000000066aaa0000)
  eden space 1118784K,  73% used [0x00000005c0000000, 0x00000005f1e52598, 0x0000000604490000)
  from space 139840K,  98% used [0x000000060cd20000, 0x00000006153db100, 0x00000006155b0000)
  to   space 139840K,   0% used [0x0000000604490000, 0x0000000604490000, 0x000000060cd20000)
 tenured generation   total 2796224K, used 1745107K [0x000000066aaa0000, 0x0000000715550000, 0x00000007c0000000)
   the space 2796224K,  62% used [0x000000066aaa0000, 0x00000006d52d4d90, 0x00000006c2e0c400, 0x0000000715550000)
 compacting perm gen  total 482944K, used 482943K [0x00000007c0000000, 0x00000007dd7a0000, 0x0000000800000000)
   the space 482944K,  99% used [0x00000007c0000000, 0x00000007dd79fff0, 0x00000007dd7a0000, 0x00000007dd7a0000)
No shared spaces configured.

私の懸念は、「圧縮されたperm gen」の使用法です。これは、割り当てられた最大perm genヒープの使用率、または最大ヒープの使用率などを意味しますか?提供されたパーセンテージは、使用済み/合計の分割であるように見えますが、これは割り当てられたパーマ生成の合計ですか?-XX:MaxPermSize1GBに設定されているので...

JVMクラッシュでダンプされたデータを解釈するための有用なリソース(hs_errファイルについて言及していないOracleホワイトペーパー以外)はありますか?

4

2 に答える 2

5

「compactingpermgen」の値を正確に説明しているリファレンスは見つかりませんでしたが、私たち自身の調査により、報告された値は次のとおりであることが証明されました。

現在使用されているPermGen/現在割り当てられているPermGen

私の質問の例では、これは482944KのメモリがすでにPermGenに割り当てられており、そのうちの482943KがGCの時点で使用されていたことを意味します(99%)。PermGenの最大サイズは1048576K(1GB)に設定されていたため、収集プロセスには、再割り当てするための十分な予約済みリソースがありました。

同様の問題に直面している人のために-私たちは最終的に問題を解決しました。私たちの場合、 sun.misc.Unsafeクラスを使用したサードパーティのライブラリであることが判明しました。このクラスは、誤って使用すると「安全ではない」ことで有名です。

この場合、オブジェクトのクローンを作成するためのロジックの一部が、オブジェクトをコピーするための特定のClassLoaderをsun.misc.Unsafe操作に渡しました。特定のマシンでは、コピーされたオブジェクトが破損した状態で定期的に作成されていました。JVMがガベージコレクションを試みたとき、最終的にこれらの不良オブジェクトの1つを収集し、クラッシュしました。これは常に私の質問で説明されているエラーを引き起こしました。

于 2013-06-03T09:41:04.393 に答える
0

ただし、MaxPermSizeを1GBに設定したからといって、HotSpotがそれを尊重するわけではありません。512MBを超えたことはないと思います。JVMの482MBは、この数値にかなり近いものです。

いずれにせよ、512MBはクラスのメタデータを保持するためにのみ使用されるため、PermGenには十分です。ClassLoaderを介してさらにクラスがロードされない限り、サイズが大きくなることはありません。したがって、問題は、メモリ内に必要なすべてのクラスのバイトコードのサイズを大まかに保持するために、本当に512MB以上が必要ですか?

システムのPermGenで実際にメモリリークが発生している可能性があります。

于 2013-06-03T06:45:41.083 に答える