FullGC発生時のログ考察
コンカレントGCの注? ? の? きのような内容ですが、コンカレントGCも含む各稜 Javaチューニングオプションを採用したTomcatぜ GC処理を調査してみました。Sun jdk1.6.0ぜ Tomcat6を使用し、メモリを確? ・枯朸 させるだけのテストサーブレットを動作させています。メモリ確保ぜ 128Mのヒープサイズに対しぜ 2度に分けて? OutOfMemoryErrorを起こさない程府 50M×2回)メモリを枯朸 させ、? 図的ぜ FullGCを発生させるように試験しています。
NoCMS(コンカレントGC無劜 ) -Xms128m -Xmx128m
NoCMS Parallel(コンカレントGC無効、パラレボ GC指定のぜ ) -Xms128m -Xmx128m -XX:+UseParallelGC -XX:+UseParallelOldGC
CMS(コンカレントGC有劜 ) -Xms128m -Xmx128m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
CMS NewTune(コンカレントGC有効、New世代チューニングあり) -Xms128m -Xmx128m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=42m -XX:MaxNewSize=42m -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=32 -XX:TargetSurvivorRatio=90
Xloggcオプションで圏 得したGCログでは、コンカレントGC実行時ぜ FullGCの発生を昜 示的ぜ “FullGC”と示さないので読み圏 ることが難しいのですが、jstatであれぜ “FullGCイベント”としてカウントしてぜ れます。jstatから圏 得した以? の情報より、FullGCの処理時間はコンカレントGC無効の場合よりも少しだけ劣化していますが、アプリケーションスレッドが並? 稼働出来ることを考えれば? 能的に有効だと思゜ れます。
? FullGCイベント NoCMS 1回 0.044秒 CMS 3回 0.058秒(計) CMS NewTune 3回 0.058秒(計) ? Young世? GCイベント NoCMS 2回 0.007秒(計) CMS 2回 0.034秒(計) CMS NewTune 1回 0.007秒
GCGraph図は、FulGC発生時ぜ jstat出力結果をグラフ化したものです。4つのグラフとも約半分の地点で各領域のサイズが大きく変動していますが、ここがFullGCが発生したポイントです。「NoCMS」と「NoCMS Parallel」に違いが見られないのは、「UseParallelGC」がServerVMのデフォルトオプションだからのようです。従って? 段同士の? 較は? 味がないです・・。上下段ぜ CMSあり・なしで? 較した場合、FUllGCが発生する前の段障 、「CMS」と「CMS NewTune」ぜ CMSありの場合ぜ EDEN領域が初期状態での利用? が高い事が゜ かります。以? ぜ CMSあり・なしぜ “ヒープサイズ領域の内? “を見ててみると? 際にぜ CMSなしの場合の方がEDEN領域は? ぜ とられていますので、単純ぜ CMS機能有効時は初期状態でオブジェクトが多ぜ 生成される為なのかもしれません。コンカレントGCでぜ GC専用のスレッドが常時処理を行うためスループットが作 いのが問題となりますが、このスレッドによるものの可能性もあります。CMSあり・なし時に? られるおもなスレッドの相違も載せておきます。
? ヒープサイズ領域の内? NoCMS EDEN:32MB FROM: 5M TO: 5M OLD:86M CMS EDEN:16MB FROM: 2M TO: 2M OLD(CMS):108M CMS NewTune EDEN:20MB FROM:10M TO:10M OLD(CMS):88M
? CMSあり・なしスレッド相違 NoCMS "GC task thread#0 (ParallelGC)" prio=10 ・・ボ runnable CMS "Surrogate Locker Thread (CMS)" daemon prio=10 ・・ボ waiting on condition "Gang worker#n (Parallel GC Threads)" prio=10 ・・ボ runnable "Concurrent Mark-Sweep GC Thread" prio=10 ・・ボ runnable "Gang worker#n (Parallel CMS Threads)" prio=10 ・・ボ runnable