目次

背景

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が明示的に指定されている場合は コマンドラインの指定に従う。

platformdefault vm
archosClient vmサーバクラスならSever VM、違うならClient VMServer VM
SPARCSolarisX
i586(=Intel互換)SolarisX
i586LinuxX
i586MS WindowsX
SPARCv9Solaris-X
AMD64Linux-X
AMD64MS Windows-X

凡例: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になる
VMoptdefault概要
-XX:GCTimeLimit98GCに要する時間の上限値(合計時間に対する割合)
-XX:GCHaepFreeLimit2GCの結果、解放されるスペースの下限値(最大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して表示するのとは違って、こっちは処理後にファイルにはく。

参考


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