1

JBoss 3.2.6 アプリケーション サーバーにはパフォーマンスの問題があり、詳細な GC ロギングをオンにして GCViewer でこれらのログを分析した後、しばらくすると (サーバーの再起動後 7 ~ 35 時間) GC がおかしくなっていることに気付きました。最初は GC が正常に動作していて、1 時間ごとに GC を実行しているように見えますが、ある時点で異常になり始め、毎分完全な GC を実行します。これは実稼働環境でのみ発生するため、明示的な GC (-XX:-DisableExplicitGC) をオフにしたり、RMI GC 間隔を変更したりすることはまだできていませんが、これは数時間後に発生するため、既知の原因ではないようです。 RMI GC の問題。

何か案は?

アップデート:

まだGCViewerの出力を投稿することはできませんが、最大ヒープ制限にまったく達していないようです。GC が狂う前は問題なく GC を行っていますが、GC が狂った場合、ヒープは 2GB (最大 24GB) を超えません。RMI 以外に、明示的な GC をトリガーできる他の方法はありますか? (コードを確認しましたが、System.gc() への呼び出しは行われていません)

4

4 に答える 4

2

あなたのヒープはいっぱいですか?VM は、実際の OutOfMemoryError を防ぐのに十分なメモリを解放できるが、実際にアプリケーションを安定して実行し続けるには十分でない場合、「GC ループ」でスタックすることがあります。

通常、これは「OutOfMemoryError: GC オーバーヘッド制限を超えました」をトリガーしますが、これが発生する前に超える必要がある特定のしきい値があります (私の頭の上から GC に費やされた 98% の CPU 時間)。

ヒープサイズを拡大しようとしましたか?コードを検査したり、プロファイラーを使用してメモリ リークを検出したりしましたか?

于 2012-09-27T13:35:22.703 に答える
1

ほとんどの場合、メモリ リークが発生し、アプリケーション サーバーを実行し続けると、最終的に OutOfMemoryException でクラッシュします。メモリ分析ツール ( VisualVMなど) を使用して、問題の原因を特定する必要があります。通常、メモリ リークは、格納されているオブジェクト参照を解放しない一部の静的オブジェクトまたはグローバル オブジェクトによって発生します。

幸運を!

アップデート:

あなたの質問を読み直すと、問題ないように聞こえますが、突然、GC がスペースを再利用するためにはるかに一生懸命働いているこの状況に陥ります。大量のヒープを消費する (そして解放しない) 特定の操作が発生するようです。

おそらく、@Timが示唆するように、ヒープ要件は最大ヒープサイズのしきい値に達していますが、私の経験では、それを正確に達成するにはかなり幸運である必要があります. いずれにせよ、いくつかの分析により、それがリークであるか、ヒープのサイズを増やす必要があるかを判断する必要があります。

于 2012-09-27T13:36:49.237 に答える
0

アプリケーションでメモリ リークが発生する可能性が高いイベントとは別に、これには他に 1 ~ 2 つの理由が考えられます。

Solaris 環境で、使用可能な 4 GB の物理メモリのほぼすべてを JVM に割り当て、オペレーティング システムに約 200 ~ 300 MB しか残していなかったときに、このような問題が発生したことがあります。これにより、OS の負荷が増加すると、VM プロセスが突然ディスクにスワップされます。解決策は、3.2GB を超えないようにすることでした。ごくまれなケースですが、あなたと同じ問題でしょうか?

これが GC アクティビティの増加につながる理由は、大量のスワッピングが JVM のメモリ管理を遅くし、生存期間の短い多くのオブジェクトがサバイバー スペースから逃れ、最終的には保有スペースに行き着くという事実です。

于 2012-09-27T13:56:29.833 に答える
0

このような場合は、スタック ダンプを実行することをお勧めします。

多かれ少なかれ、スレッド人口の爆発でこれが起こるのを見てきました。

とにかく、スタックダンプファイルを見て、何が実行されているかを確認してください。cron ジョブや監視スクリプトをjstack定期的に実行するように簡単に設定できます。

スタック ダンプのサイズを比較することもできます。それが本当に大きくなると、たくさんの糸を作る何かができます。

大きくならない場合は、少なくともどのオブジェクト (コール スタック) が実行されているかを確認できます。

それがうまくいかない場合は、後でVisualVMまたはいくつかの派手なJMXがらくたを使用できますが、最初jstackは使いやすいので始めてください。

于 2012-09-27T14:07:31.867 に答える