JVMのGCアルゴリズムいろいろ.

1.4以上のJVMにはデフォルト,Parallel Copy,Parallel Scavenge,Concurrent Mark and Sweep(CMS),Parallel CopyとCMSの組み合わせといろいろありますな.

これらの言葉は,「How To Tune The HotSpot Virtual Machine(PDF)」から引用.それぞれ,こんなオプション付ける.

  • デフォルト
    • なし
  • Parallel Copy
    • -XX:+UseParNewGC -XX:ParallelGCThreads=
  • Parallel Scavenge
    • -XX:+UseParallelGC -XX:ParallelGCThreads= -XX:+UseAdaptiveSizePolicy
  • Concurrent Mark and Sweep(CMS
    • -XX:+UseConcMarkSweepGC

ちょっとヒマ見てそれぞれの特性つかもうと思ったけど,「ちょっとヒマ」程度のサンプリングではなんの足しにもならんことが判明.orz.
理由は以下の通り.

  • ある程度の負荷をかけるわけだが,計測時間が短いとGCの特性がよくわからない.
    • 計測時間が短いとか多重度が少ないと,あんまりGCが発生しなかったりするんだ.
  • 本番とあまり構成がかけ離れたパラメタ設定だと,これまた役に立たなかったりする.
    • 計測時間にあわせてヒープサイズ減らしてGC発生しやすくしても,メモリが少ないからGCの所要時間も短いのよね.

少なくとも,ヒマ潰しで10多重程度の負荷を3分〜5分掛けたくらいだと,デフォルトGCと比べて劇的に改善されたりはしてなかった.
#1〜1.5割程度の効率改善は見受けられたけど,測定誤差の範囲じゃないのと.


結局のところ,ある程度本番に近い構成にして,これまたある程度長い間(1週間とか?)計測してないとリアルな値は取れないのだろう.:-(


ま,それでもCPU複数枚積んでいるんだったら,デフォルトGC使うのはもったいないんじゃないかな?
でも,デフォルトGCが一番「枯れている」とも言えるか...

となると「デフォルトGCで問題なければ,わざわざ他のGCアルゴリズム使わんでいい」とするか.
でも,せっかくマルチCPUの筐体使ってるんだし...(>無限ループに入る)