差分表示


* 背景
J2SE5.0のJava HotSpot VMに関する覚書。主にGarbage collcor周り、且つサーバVMの場合。~
基本的にJ2SE5.0向け配布ドキュメントからの抜粋である。
** client/server
Java HotSpot VM、J2SE5.0でも2種類ある。HotSpot VMは1.4からのVMで、1.3までのものはこれに対して Classic VMと言われる。
,名前,用途,目標
,Java HotSpot Client VM,スタンドアロンアプリケーション用途,起動時間の短縮とfootprintの縮小
,Java HotSpot Server VM,サーバ用途,実行速度が最大

server/clientに共通する機能は
- Adaptive Compile。必要なところだけをCompileして、on-memoryで持つっぽい。
- 高速のメモリ割り当てとGC
- スレッド同期。スレッドスケジューラが、大規模メモリ共有型の複数CPUサーバで上手くスケジューリングできるように作っているらしい。
* 5.0からの機能
メモっておこうと思うところだけ、抜粋しとく。
** クラスデータの共有
** マシンクラスの検出
Client VMとServer VMのどっちを使うかの判定基準を、起動時に勝手に選んでいる。
J2SE5.0の場合、2CPU/2GB RAMのマシンをサーバクラスマシンとしている。~
当然のことだが、コマンドライン引数で、-server or -clientが明示的に指定されている場合は
コマンドラインの指定に従う。~

,platform,,default vm,,
,arch,os,Client vm,サーバクラスならSever VM、違うならClient VM,Server VM
,SPARC,Solaris,,X,
,i586(=Intel互換),Solaris,,X,
,i586,Linux,,X,
,i586,MS Windows,X,,
,SPARCv9,Solaris,-,,X
,AMD64,Linux,-,,X
,AMD64,MS Windows,-,,X

CENTER:凡例:X=デフォルトVM、-=このplaftormで提供されていないVM
** GCの Ergonomics
GCのErgonomicsって、日本語ではどういうのでしょう?w
*** Default garbage collectorの変更
%%%サーバクラスのマシン、且つサーバVMを実行している%%%場合、
,1.5.0以降,1.4.2まで
,-XX:+UseParallelGCがデフォルト,-XX:+UseSerialGCがデフォルト

となった。上記 switchの明示的な指定で変更可能。
*** 初期heap/max heapの変更
パラレルコレクタを使用するサーバクラスマシン(VMはクライアントVM、サーバVMのどちらも)
では

,,1.5.0以降,1.4.2まで,JVM option
,初期heap size,物理メモリの1/64以上(or platform依存),platform依存,-Xmx
,max heap size,物理メモリの1/4未満(or platform依存),64MB,-Xmx

となった。
*** パラレルコレクタのelapsedしきい値
パラレルコレクタが、少量のheapのcollectionにしきい値(はよくわからん)を越えると
メモリ不足の例外をthrowする。以下のパラメタが、この例外のtriggerになる
,VMopt,default,概要
,-XX:GCTimeLimit,98,GCに要する時間の上限値(合計時間に対する割合)
,-XX:GCHaepFreeLimit,2,GCの結果、解放されるスペースの下限値(最大heapサイズに対する割合)

*** AdaptiveSizePolicyの実装変更
パラレルコレクタを使用すると、デフォルトでonになる -XX:+UseAdaptiveSizePolicyの実装は
- 望ましい最大GCの一時停止目標 
-- -XX:MaxGCPauseMillis
GCのPause時間の上限値。デフォルト値は無し。
-- -XX:GCTimeRatio
GCの合計時間に対する、アプリケーション稼働時間(=GCが動いていない時間)の割合。
デフォルトは99、つまり1:99=(GCにかかる時間):(GC以外の時間)ということ。~
目標値は1/(1+ [GCTimeRatioの設定値])である。
- 望ましいアプリケーションのスループット目標
- 最小占有スペース

を考慮して、改修された。以下の順で、チェックしている~
- [1] GCのpause時間が目標よりも長い場合は、世代サイズを小さくする。
- [2] [1]がclearなら、スループット目標を達成するように世代サイズを大きくする。
- [3] [1],[2]がclearなら、世代サイズを小さくして、footprintを小さくする

** lockの検出
Ctrl+\ を受けて、thread dumpとLockの検出をするらしい。~
これは、まぁ、一回使ってみれという感じ。
* 1.4からの機能
メモっておこうと思うところだけ、抜粋しとく。
** loggc
GC時に、かかった時間とheapの変動量をログファイルにはく-verbose:gc互換機能。jvmstat/jstatはhsperfdataをpollingして表示するのとは違って、こっちは処理後にファイルにはく。~

* 参考
- [[Java HotSpot VM Options>http://java.sun.com/docs/hotspot/VMOptions.html]]
-- [[微妙に訳>VMOptions]]
- [[Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine>http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html]]
-- [[微妙に訳>GCTuning5]]


Last-modified: 2007-03-15 03:16:31