Java ConcurrentMarkSweepガベージコレクタは除去全ての廃棄物の放射能を調べる
-
28-09-2019 - |
質問
短形式:CMSのガベージコレクタが未回収のさらなる向上とともに、量のごみ;最終的に、JVM満杯にな応じ.無GC外部ツール(JConsoleや jmap -histo:live
)掃除できます。
更新:この問題に関わりのJTopプラグインのためのJConsole;からない場合は実行JConsole、または実行しないで、JTopプラグインの挙動を受け始めました。
(テクニカルノート:まだ走行Sun JDK1.6.0_07、32ビット、Linux2.6.9ます。更にJDKバージョンによってオプションがない限りはないが、やむをえない主な理由です。また、当社のシステムが接続インターネットアクセス可能な機械なので画面のJConsoleなどなオプションになります。)
今現在実行中の当社のJVMの旗:
-server -Xms3072m -Xmx3072m -XX:NewSize=512m -XX:MaxNewSize=512m
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=70
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+DisableExplicitGC
を観察するメモリのグラフJConsoleが全GCる毎~15分時の最初の数時間にわたる当社アプリの寿命;後に全GCありメモリが使用中です。数時間後に、システムが安定した状態が約2GBのメモリー使用がタイトになっているCMS旧世代
る音のようにクラシックのメモリリークを外した場合に利用するツール力のフルGC(打を"ゴミの回収"ボタンJConsoleや jmap -histo:live
, など)、古い世代が突然落下~500MB以上の空き容量を使用し、当社の申請により応答性の数時間の間に、同じパターンを続けた後、各フGCりのgenを行います。)
一つの注意:にJConsoleの報告ConcurrentMarkSweep GCカウント滞在を0まで力GCとjconsole/jmapすることになりました。
を使用 jmap -histo
や jmap -histo:live
に配列することができるようになるそうで回収物は:
- 数百万
HashMap
s-配列HashMap$Entry
(1:1の比率) - 数百万
Vector
s-オブジェクトの配列(1:1の比率とほぼ同じ数HashMaps) - 数百万
HashSet
,Hashtable
, は、com.sun.jmx.remote.util.OrderClassLoader
sなどの配列Hashtable$Entry
(同じも数;約半数と同数のHashMaps、ベクトル)
が指導力を発揮する必要があると結GC出力。私の解釈とされるCMSのGCは中断されない失敗を止め世界ます。私は、私の審この出力か?ものがあるのか、それは何なのかが不適切と判断する。
期間中は通常のランタイム時において、CMSのGC出力ブロックを待つようになります:
36301.827: [GC [1 CMS-initial-mark: 1856321K(2621330K)] 1879456K(3093312K), 1.7634200 secs] [Times: user=0.17 sys=0.00, real=0.18 secs]
36303.638: [CMS-concurrent-mark-start]
36314.903: [CMS-concurrent-mark: 7.804/11.264 secs] [Times: user=2.13 sys=0.06, real=1.13 secs]
36314.903: [CMS-concurrent-preclean-start]
36314.963: [CMS-concurrent-preclean: 0.037/0.060 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
36314.963: [CMS-concurrent-abortable-preclean-start]
36315.195: [GC 36315.195: [ParNew: 428092K->40832K(471872K), 1.1705760 secs] 2284414K->1897153K(3093312K), 1.1710560 secs] [Times: user=0.13 sys=0.02, real=0.12 secs]
CMS: abort preclean due to time 36320.059: [CMS-concurrent-abortable-preclean: 0.844/5.095 secs] [Times: user=0.74 sys=0.05, real=0.51 secs]
36320.062: [GC[YG occupancy: 146166 K (471872 K)]36320.062: [Rescan (parallel), 1.54078550 secs]36321.603: [weak refs processing, 0.0042640 secs] [1 CMS-remark: 1856321K(2621440K)] 2002488K(3093312K), 1.5456150 secs] [Times: user=0.18 sys=0.03, real=0.15 secs]
36321.608: [CMS-concurrent-sweep-start]
36324.650: [CMS-concurrent-sweep: 2.686/3.042 secs] [Times: uesr=0.66 sys=0.02, real=0.30 secs]
36324.651: [CMS-concurrent-reset-start]
36324.700: [CMS-concurrent-reset: 0.050/0.050 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
できませんどうしたらいいですか;次の行の次のParNewます。
ま軍GCを用いjmap-histo:ライブまで取得す:
48004.088: [CMS-concurrent-mark: 8.012/8.647 secs] [Times: user=1.15 sys=0.02, real=0.87 secs]
(concurrent mode interrupted)
次いで~125ラインは、以下のフォーム:(一部GeneratedMethodAccessor、GeneratedSerializationConstructoraccessor、GeneratedConstructorAccessorなど)
[Unloading class sun.reflect.GeneratedMethodAccessor3]
その後:
: 1911295K->562232K(2621440K), 15.6886180 secs] 2366440K->562232K(3093312K), [CMS Perm: 52729K->51864K(65536K)], 15.6892270 secs] [Times: user=1.55 sys=0.01, real=1.57 secs]
感謝。
解決
com.ます。jmx.遠い。util.OrderClassLoaderを使用してリモート'ing層JMX、クイックレビューのコードが彼らのunmarshalling過程のリモート要求のJVM.の寿命れたclassloaderが直接関係の寿命をもった非整列化なっていく参照することには、classloaderがリリースされます。
くださる場合この場合のこれらのインスタンスの直接的結果を使用していまJConsole検討のために国家議会、JVM.うんきちGCによる一部として正常な動作が得られます。
うことなんでしょうけれどきあるバグのJMX実施(じるように考えにくいことで比較的最JVM)ことがおありかもしれませんねていくつかのカスタムのMbeanまたは使用のいくつかのカスタムJMXツールの原因となる問題です。でも、私は疑いのOrderClassLoaderから赤ニシンの発行にある他の場所で壊れたGCまたはその他の漏えい).
他のヒント
技術的なメモ:Linux 2.6.9ボックスでSun JDK 1.6.0_07、32ビットを実行しています。 JDKバージョンのアップグレードは、避けられない主要な理由がない限り、実際にはオプションではありません。
いくつかの新しいJavaバージョンには、CMS Garbage Collectorの更新がありました。特に6U12、6U14、および6U18。
私はGCの専門家ではありませんが、6U14の途中の修正を推測しています 五月 表示されている問題を修正します。もちろん、6U18のクラスをアンロードするバグについても同じことを言うことができました。私が言ったように、私はGCの専門家ではありません。
の修正があります:
- 6U10 :(影響6U4+)CMSは、-XX:+parallelRefprocenabledの場合、指示対象をクリアしません
- 6U12:CMS:同時の就職中のオーバーフラインドオブジェクトアレイの誤ったエンコード
- 6U12:CMS:並列同時マーキングを使用する場合のオーバーフロー処理が正しくありません
- 6U14:cms:アサーション障害 "is_cms_thread == swrep :: current() - > is_concurrentgc_thread()"
- 6U14:CMS:cmsinitiating occupancyfractionとの離婚にcmsinitiatingpermoccupancyfractionが必要です
- 6U14:CMS ASSERT:_CONCURRENT_ITERATION_SAFE_LIMITアップデートが欠落しています
- 6U14:CMS:参照リストの就職中のオーバーフロー処理が誤っていない
- 6u14:sigsegvまたは(!is_null(v)、 "ooop値はゼロになることはありません")
- 6U14:CMS:CompactibleFreeListsPace :: Block_Size()のLivelock。
- 6U14:CMSを圧縮OOPSで動作させます
- 6U18:CMS:-xx:+usecompressedoopsを使用したコアダンプ
- 6U18:CMS:クラスアンロードに関連するバグ
- 6U18:CMS:CMSの存在下でのRedoceInitialCardmarks
- 6U18:[Regression] -XX:-XXを備えたNewRatio:+USECONCMARKSWEEPGCが致命的なエラーを引き起こす
- 6U20:カードマークの延期が長すぎる可能性があります
上記のすべてに加えて、6U14は G1 ガベージコレクターは、まだテスト中ですが。 G1は、Java 7のCMSを置き換えることを目的としています。
G1は、Java 6U14で使用でき、次のコマンドラインスイッチで新しいものを使用できます。
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
私は次のように、はるかにシンプルなものから始めます。
-server -Xms3072m -Xmx3072m -XX:+UseParallelOldGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
そして、これがあなたのニーズを満たしているかどうかを確認してください。
所有者を指すオブジェクトを構築しているように見えます(AポイントBはAを指します)。これにより、参照カウントがゼロを超えたままになるため、ガベージコレクターはそれらをきれいにすることができません。リリースするときにサイクルを破る必要があります。 AまたはBのいずれかの参照を無効化すると、問題が解決します。これは、より大きな参照でも機能します(A-> b-> c-> d-> a)。ハッシュマップでは、ベクトルとオブジェクト配列を使用できます。
リモートローダーのプレゼンスは、JNDIまたは他のリモートアクセス法を介してロードされたオブジェクトへの参照をクリーンアップして閉じることができないことを示している場合があります。
編集:私はあなたの最後の行を再見ました。 Permの割り当てを増やすことをお勧めします。