5

私たちはアプリの permgen メモリ スペースをどんどん高くしてきましたが、permgen 領域に食い込んでいる何らかのリークがあるかどうかを調べようとしています。ホット アンデプロイ/再デプロイ アクションは実行しませんが、動的および CGLIB 生成の両方のプロキシが多数あります。また、さまざまなユースケースをサポートするために、いくつかの複雑なクラスローダー ビットも実行しています。これらも、permgen の浪費の一因である可能性があるのではないかと疑っています。

そこで、実行中のアプリで jmap -permstat を実行し、permgen スペースを埋めている可能性があるものについて洞察を得たいと考えています。(permstat の出力から得られる可能性のある手がかりを追跡できるように、ライブ オブジェクトとデッド オブジェクトの両方で通常のヒープ ダンプも実行します)。

ただし、jmap permstat によってリストされた 2400 のクラスローダーのうち、ブートストラップ クラスローダーを除くすべてが「デッド」としてリストされます。アプリは間違いなくライブで動作しているため、これは意味がありません。

私の理解では、クラスローダがガベージ コレクションの対象である場合、jmap はそのクラスローダを「死んだ」と報告しますが、ここでは間違っているに違いありません...

私は何が欠けていますか?ここでの「死んだ」とはどういう意味ですか? グーグルで調べても、私がここで持っている誤解以外の多くの答えは得られません。

4

1 に答える 1

1

ここにいくつかのアイデアがあります:

  1. 最新のVMにアップグレードします。
  2. 何らかの理由でを実行して-XX:+UseConcMarkSweepGCいる場合は、も使用していることを確認してください-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  3. インスタンスを保持しているユーザーを確認するには、jhatで「ルートセットからの参照チェーン」を実行します。弱い参照を除外することを忘れないでください!
  4. この長い投稿は少し複雑で、私自身は試していませんが、役立つかもしれません。
  5. JRockitなどの別のVMを試してください
于 2011-07-12T03:01:30.603 に答える