10

現在、私のアプリケーションが散発的に長いGC時間を示しているという問題に直面していますが、これらはすべて弱い参照処理が原因でのみ発生します。したがって、スレッド停止時間は常に弱いref処理時間に近くなります。他のすべてのGCサイクルは、0.0001秒から0.200秒です。

gc.logから(再フォーマット):

10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) , 
 0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs] 
 [1 CMS-remark:  2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs] 
 [Times: user=2.51 sys=0.00, real=2.18 secs]
Total time for which application threads were stopped: 2.1906890 seconds

現在、これらの設定を行っています。より簡単な設定を試しましたが、変更はありません。

-Xms4g
-Xmx4g
-XX:NewSize=128m
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:MaxGCPauseMillis=50
-XX:CMSInitiatingOccupancyFraction=50
-XX:ParallelGCThreads=16
-XX:+DisableExplicitGC

NewSizeを上げると、通常のGCサイクルが長くなります。マシンには8つのコアがあり、アプリケーション用にそれほど多くのCPUを消費しません。古い世代のGCを早期に同時に実行しようとしました。

そして、はい、これはサードパーティのライブラリの一部であるため、弱いrefの使用法を取り除くことはできません。

4

1 に答える 1

7

このメッセージは「hotspot-gc-use」メーリングリストで見つかりました。

要するに、-XX:+ParallelRefProcEnabledスイッチを試してください。


アップデート

Jon Masamitsuのウェブログでより良い説明を見つけました:

6)ローポーズコレクターでの並列参照処理。

オブジェクトを広範囲に使用するアプリケーションの場合Reference、参照オブジェクトを処理するためのGCの作業が目立つ場合があります。低ポーズコレクターでは、他のコレクターよりも必ずしも悪いわけではありませんが、より痛いです(一時停止を低く保とうとしているため)。ローポーズコレクターでは並列参照処理を使用できますが、デフォルトではオンになっていません。参照オブジェクトが大量にない限り、通常、参照処理を連続して実行する方が高速です。オブジェクト-XX:+ParallelRefProcEnabledを多用する場合は、フラグを付けてオンにします(ほとんどのアプリケーションは使用しません)。Reference

于 2010-11-04T21:57:44.917 に答える