0

Java でいくつかのバッチ ジョブを実行するために、HP UX サーバーを起動しようとしています。簡単に言えば、問題は次のとおりです。

これらのバッチ ジョブは、Jeus アプリケーション サーバー (Made in Korea 製品) で実行されます。ほとんどのジョブは時間通りに実行されていますが、一部のバッチ ジョブでは、有名な PermGen のメモリ不足エラーが報告されています。ヒープ ダンプを取得し、JVM オプションの調査を開始しました。Xms - 2048m Xmx - 2048m PermSize - 512m MaxPermSize - 512m。古い GC コレクターは CMS であり、若い世代のコレクターは Parallel Collector です。

実際のヒープ サイズは非常に良好であり、PERm Gen が 512m のメモリをすべて使い果たしたことに気付きました。HPJmeter は、これがメモリの緩やかな上昇であることを示したため、メモリ リークが疑われました。すべての Class Loader を調べたところ、コア Jeus App Server ClassLoader のインスタンスが約 168 ありました。メモリ リーク エスティメータは、このクラス ローダーがメモリ リークを起こしていることを示しました。保持されているバイト数はわずか 3MB 程度であることがわかりました。

このクラスローダーによってロードされたクラス/タイプの数を調べたところ、約 512 個の項目がありました。メモリ リークは、他のいくつかのオブジェクトがメモリ リークに関与していることも示していました。

次の質問があります。

  1. リークしている Classloader が特定されたので、問題の原因となっている参照を正確に特定するにはどうすればよいでしょうか?
  2. 特定のオブジェクト ID を持つ 1 つのクラス ローダーがメモリ リークを起こしていると表示された場合、同じクラス ローダーの他のインスタンスがさまざまな量のメモリをリークしている可能性はありますか?
  3. 次に何をすべきかについてのガイダンスは高く評価されます。

アディティア。

4

1 に答える 1

1

「リーク」しているのはクラスローダーですか、それともローダーによってロードされたクラスがまだ参照されていますか?

「ユーザー クラス ローダー」は通常、後でアンロードする必要があるクラスをロードするために使用されることを理解してください。たとえば、ある種の Web ページ生成スキームとしてクラスが動的に生成される場合、これらのクラスを独自のクラス ローダー内にロードして使用する必要があります。その後、クラスとそのローダーへの参照の痕跡をすべて削除する必要があります。これらの参照がなくなると、ローダーとロードされたクラスが収集されます。

ある種のキャッシュがクラスへの参照にぶら下がっている場合 (たとえば、クラスのオブジェクトを参照したり、他のローダーで他のクラスからクラスにリンクしたりすることによって)、コレクションは発生しません。

于 2012-07-18T03:41:57.297 に答える