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が発生しなかったりするんだ.
- 本番とあまり構成がかけ離れたパラメタ設定だと,これまた役に立たなかったりする.
少なくとも,ヒマ潰しで10多重程度の負荷を3分〜5分掛けたくらいだと,デフォルトGCと比べて劇的に改善されたりはしてなかった.
#1〜1.5割程度の効率改善は見受けられたけど,測定誤差の範囲じゃないのと.
結局のところ,ある程度本番に近い構成にして,これまたある程度長い間(1週間とか?)計測してないとリアルな値は取れないのだろう.:-(
ま,それでもCPU複数枚積んでいるんだったら,デフォルトGC使うのはもったいないんじゃないかな?
でも,デフォルトGCが一番「枯れている」とも言えるか...
:
となると「デフォルトGCで問題なければ,わざわざ他のGCアルゴリズム使わんでいい」とするか.
でも,せっかくマルチCPUの筐体使ってるんだし...(>無限ループに入る)