java incgc

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
1.4と1.5では-Xinggcで使用するGCが違う

1.4 TrainGC
1.5 ConcMarkSweepGC
1.5以降でTrainGCを使いたい場合は -XX:+UseTrainGC

http://d.hatena.ne.jp/masanobuimai/20070821

とは言え,多少なりとも良くなるんだったらと思い,VMの設定をこんな具合に変えてみた。
-Xms256m -Xmx386m
-XX:NewSize=128m -XX:MaxNewSize=256m
-XX:MaxPermSize=96m
-Xincgc

何が悲しくて,こんなことせにゃならんのかと思いつつも,YourKitでモニタリングしながらIDEAを使ってみたら,ヒープの消費量やGCは随分改善されたぞ(それも体感できるほどに,だ)。

#インクリメンタルGCも使ってみるモンだな。

http://java-house.jp/ml/archive/j-h-b/051099.html#body

From: takamure@netstar-inc.com (Takamure, Naoki)
Subject: [JavaHouse-Brewers:51093] sun jre1.4.0 で Xincgc オプションの指定について
Date: Mon, 9 Sep 2002 00:17:39  JST
Message-ID: <002101c2574b$4e709540$4c32a8c0@netstar.co.jp>
> しています。jre1.4.0でXincgcを指定すると、メモリ使用量が
> 抑えられると思い、アプリケーションに負荷をかけ、

> すると、Xincgcを付けない方がメモリ使用量が増えないように
> 思えます。私の理解が誤っていたのでしょうか?もし、これに

それは間違って理解していると思います.

HotSpotのホワイトペーパーに,Incremental "Pauseless" Garbage Collector
と書いてあるように,GC時の停止時間をほぼ10ミリ秒以下に抑えることができ
る(ただし最大停止時間の保証はしません)のが特徴のようです.

http://java.sun.com/products/hotspot/docs/whitepaper/Java_HotSpot_WP_Final_4_30_01.html#pgfId=1082247

結局,現在のHotspot VMでは,デフォルトで世代別コピー式GCを使用していて,
多くのオブジェクトは短命なので,高速にGCをおこなえるのですが,問題は旧
世代に殿堂入りしたオブジェクトのGCがマーク&コンパクト方式で,非常に遅
いことです.

そこで,停止時間の問題が発生する場合を考慮して,HotSpot VMでは,
-Xincgcを指定した時に,旧世代(old generation)をTrain アルゴリズムを用い
て管理するようになるようです.

このTrainアルゴリズムの論文は,

ftp://ftp.cs.umass.edu/pub/osl/papers/iwmm92.ps.Z

にあり,簡単な説明は,

http://cs.haifa.ac.il/courses/java/gc.pdf

にあります.

実際に,HotSpot VMがどのようにメモリを管理しているかは,次のドキュメン
トの図を見ればわかります.

Tuning Garbage Collection with the 1.3.1 JavaTM Virtual Machine
http://java.sun.com/docs/hotspot/gc/index.html

これを見れば,まず新世代(young generation)と旧世代(old generation)に大
きく分割され,さらに各世代が細かく分割されています.

結局,基本的には,スループット,停止時間,フットプリントという3つの要
素について考慮すると,スループット(インクリメンタルGCは停止時間は短く
ても,総合的に見ると遅いことに注意)とフットプリントの点ではデフォルト
のGC方式の方が,停止時間の点では-Xincgcを指定した方が有利だと思います.

ただし,ヒープの最大2GBという制約がなくなりつつある昨今,フットプリン
トは致命的なものではなくなりつつありますし,上記及び下記のドキュメント
を見ればわかるように,パラメータチューニングも可能です.

FREQUENTLY ASKED QUESTIONS ABOUT THE JAVATM HOTSPOT VIRTUAL MACHINE
http://java.sun.com/docs/hotspot/PerformanceFAQ.html

JavaTM HotSpot VM Options
http://java.sun.com/docs/hotspot/VMOptions.html

結局は,まず性能のどの要素を重視するかを考えてGC方式を選ぶことと,さら
にパラメータチューニングをおこなって性能を引き出してやることが重要です.

実際に,パラメータチューニングによって,実行性能が劇的に変化することが
ありますので,特にJavaプログラムの実行性能の点で困っている方は,まず上
記ドキュメントを熟読することをお薦めします.

たとえば,新世代のサイズが小さく,殿堂入りが早すぎ,そのために実行性能
が落ちることがありますが,この場合は-Xincgcを指定するよりも,
-XX:MaxNewSizeや-XX:NewRatioなどのオプションを調節する方がよいこともあ
ります.

他に,フットプリントが多すぎる場合には,これらのオプションを調節して,
使用しないメモリ領域を削ることも可能でしょう.

# GCの専門家ではないので間違いがあるかもしれませんので,その場合は補
# 足してください.

風間 一洋 (kazama@ingrid.org)           NTT Network Innovation Laboratories