web-dev-qa-db-ja.com

コンカレントマークスイープ(CMS)は世界のイベントを止めますか?

クラスのアンロードが多く見られ、その期間中にシステム全体がハングします。

[Unloading class Sun.reflect.GeneratedMethodAccessor117]
[Unloading class Sun.reflect.GeneratedConstructorAccessor1896]
[Unloading class Sun.reflect.GeneratedSerializationConstructorAccessor485]
[Unloading class Sun.reflect.GeneratedSerializationConstructorAccessor579]
.... // about 1700 of them

同時に、permスペースのスパイクは見られないので、GCイベントではないようです。

以下を知りたい

コンカレントマークスイープコレクションは世界のイベントを止めるのですか?

パーマスペースがいっぱいでなくても起こりますか?

14
user4127

CMSはGCの一種であり、フェーズに分かれています。

enter image description here

ご覧のとおり、最初のマークとリマークは世界のイベントを停止します。

ソースReviewing Generational GC and CMSセクションの下。

Does it happen even when the perm space is not full?

このためのAFAIKには、CMSClassUnloadingEnabledUseConcMarkSweepGCが必要です。また、permgen領域がしきい値に達すると、FGCがトリガーされます。

また、同時スイープ(フレーズ(4))は、permgen領域がいっぱいになった場合(およびGCがpermgen領域を処理している場合)、STWイベントではありませんが、すべてのプロセススレッドを停止し、必要なすべてのメモリが再利用されるまで実行中のGCスレッドのみにつながる可能性があります。

21
Aniket Thakur

CMSは「イベント」ではありません。ガベージコレクターです。 CMSには、すべてが停止する2つのフェーズがありますが、通常の状況では、これらは非常に短い(数ミリ秒)です。一般に、長い一時停止が発生した場合は、CMSが(設定された制約内で)ガベージ生成の速度に追いつくことができず、JVMが「」を使用して完全なGCを実行する必要があることを意味します。マークスイープ」コレクター...世界を止めます。

JVMによっては、完全なGCが発生した場合にのみpermgenが収集され、permgenが発生した場合にのみクラスが収集/アンロードされる場合があります。 GCされました。

しかし、クラスのアンロード長い一時停止を引き起こしていると推測することはできません。実際、GC統計で、permgenがいっぱいになっていないと表示されている場合は、逆の可能性が高くなります。

クラスのアンロードのloggingcausing "である可能性もあります。 「世界を止めろ」の問題: http://bugs.Java.com/bugdatabase/view_bug.do?bug_id=66372 を参照してください。


観察:

  • 動的に作成されたクラスのアンロードに関するメッセージが何千もある場合は、システムのアーキテクチャを調べます。プロキシクラスを使いすぎていませんか?

  • Java 8)を使用すると、permgenはなくなり、メタスペースに置き換えられます。アップグレードmayにより、問題が緩和されます。

5
Stephen C

通常、permgcはハングアップの問題を引き起こしません。

その理由は、Permは通常、アプリケーション内のすべてのクラスがロードされた後に安定化されるためです。電話を切った結果である可能性があります。つまり、JVMに十分なメモリがない場合です。 Full-GCを試みます。完全なgcの一部として、PermはGCされます。

あなたが尋ねた質問についてCMSはフルGCも作ります。フルGCの数を減らすだけです。マイナーGC中に、古いメモリ領域も収集します。

私の意見では、ヒープメモリに問題がある可能性があり、フルGCの数が多くなり、ハングの問題が発生します。したがって、ビジュアルJVMツールまたはある種のGCログ分析を使用してメモリ使用量を確認する必要があります。古いメモリ領域がいっぱいで、JVMがそれをGCしようとしたことがあります。ただし、十分なメモリが解放されず、gcが再試行されます。再試行してください。

メモリリークがあると思います。問題。したがって、GCログ分析を行うことをお勧めします。メモリリークの問題である場合は、ヒープダンプを作成して分析する必要があります。

1
Terry Cho