Java/ガベージ

Last-modified: 2008-12-26 (金) 09:53:30

http://java.sun.com/docs/hotspot/gc1.4.2/index.html
http://docs.hp.com/ja/6607/SDK_RN_14208.htm
「ガベージコレクション」をやさしく学ぶぶ
http://www.atmarkit.co.jp/fjava/rensai4/troublehacks02/troublehacks02_1.html

http://db-www.naist.jp/~makoto-y/tdiary/?date=20070609
Java1.6 RMI
RMI

GCViewer

GCViewerの入手先:tagtraum industries
ガベージコレクションのログファイルを視覚化し、解析を行うためのツール。

  • 動作テスト環境(2008/08)
    • GCViewerのバージョン: gcviewer-1.29
    • OS: Windows XP
    • Java:jdk1.6.0_07
    • Eclipse: Eclipse3.3.1+TomcatPlugin
    • Tomcat6.0
  • インストールファイル
    • gcviewer-1.29-bin.zip
  • インストール
    • ダウンロードしたzipファイルを任意の場所に解凍
    • gcviewer-1.29フォルダ内にあるgcviewer-1.29.jarをダブルクリックすると、GCViewerが起動されます。
  • GCログファイルの出力方法(GCViewer非依存)
    • javaオプションに「-Xloggc:C:\gclog.txt -verbose:gc」を付けます。(C:\直下にログ出力する場合)
    • ※オプションの設定は、Eclipseの[ウィンドウ]>[設定]から、[Tomcat]-[JVM設定]で[JVMパラメータへ追加]で追加しました。
  • GCViewerを使う
    • GCViewerを起動する。

JVM1.4.x

GC

  • Java HotSpot VMの基本機能の1つ。
  • JVM1.4.1からの新機能
    • GC作業を複数スレッドで同時に行うパラレルGC
    • GC作業の多くをアプリケーションスレッドと同時に行うコンカレントGC
世代別GC
・寿命が短いオブジェクトと、寿命が長いオブジェクトという考え方
・短命オブジェクトを割り当てる領域:New領域
・長命オブジェクトを割り当てる領域:OLD領域

(図)

Eden領域From領域To領域OLD領域
New領域
  • New世代GC
    • オブジェクトが生成されると、そのオブジェクトはEden領域に割り当てられる。そして、Edenがいっぱいになって領域が不足した場合に、New世代を対象としたGC(New世代GC)が実行される。
    • New世代GCでは、Eden領域内のライブオブジェクトがTo領域にコピーされる。このとき、オブジェクト間の参照整合性を保ちながら安全にオブジェクトを移動させるため、New世代GCの実行中はアプリケーションスレッドを全て停止させる必要がある。
    • New世代GCごとに、From領域とTo領域の役割が交代する。2回目以降は、From領域のライブオブジェクトもTo領域にコピーされる。
    • New世代GCではアプリケーションの停止時間は短く、悪影響は少ないと考えられる。
  • OLD世代GC
    • 長命オブジェクトは、New世代領域からOLD世代領域に移動する。その移動の判断として、オブジェクトが経験したGC回数を年齢属性として持たせる。そして、ある年齢に達したオブジェクトはOLD領域に移動する。
    • OLD領域がいっぱいになって空き容量が不足すると、OLD世代領域を対象としたOLD世代GCが起こる。OLD世代GCは、OLD領域内でライブオブジェクトをマーク(mark)し、非ライブオブジェクトを解放(sweep)し、フラグメンテーションを解消するためにライブオブジェクトを集めて、連続領域に移動する(compact)。以上より、mark-sweep-compact方式とも呼ばれる。
  • パラレルGC
    • 標準のGCではNew世代領域に対してシングルGCを行っていたが、パラレルGCでは複数のスレッドを使って同時に行う。
  • コンカレントGC
    • 標準のGCではOLD世代領域のGC期間中stop the worldにあったが、このGCではGC処理の多くをアプリケーションと並行に処理できる。

GCログ

Sun系

0.449: [GC 196608K->352K(753664K), 0.0016990 secs]

0.449: JVMが起動してからの時間を表す(秒)
GC: マイナーGC
196608K: GC前のヒープ利用量
352K: GC後のヒープ利用量
(753664K): 合計ヒープ容量
0.0016990secs: GCイベントの持続時間