Upload
cactusman
View
6.447
Download
0
Embed Size (px)
Citation preview
GC についてcactusman
自己紹介• HN : cactusman (さぼてん) • 年齢: 0x1d • 出身:関西 • 所属: java-ja,Wicket-ja • 肩書き: Hudson コミッタ
GC についてですが
読め!
注意事項• 対象は初心者• マニアックなことは話しません。
アジェンダ• GC について• 基本アルゴリズム• HotSpotVM の GC
GC とは• プログラム上で不要となったメモリをま
とめる動作1. メモリ領域上の不要なゴミを見つける2. ゴミを回収し、プログラマが再度利用でき
るようにする
一言で言うと
ルート
ゴミ
GC を学ぶ意義• メモリ領域の効率的な使い方を意識• 枯れない技術– 1960 ~
• 技術的に面白い(らしい)
Java における GC
• 「 Java 仮想マシン」( JVM )では実装依存– 「 Java 仮想マシン仕様書 第2版」 第3章 Java 仮想マシンの構造 冒頭に記述
• 今回の JVM の GC は HotSpot について
GC の基本アルゴリズム
• マーク&スイープ• 参照カウント• コピー
• GC アルゴリズムはこの基本アルゴリズムの派生
マーク&スイープ1. ルート要素からたどれるオブジェクトを
マークしていく2. マークのないオブジェクト(ゴミ)を回
収する
マーク&スイープ• メリット– 実装が簡単
• デメリット– フラグメンテーション– アローケーション速度– 停止時間が長い
参照カウント• 自身のオブジェクトが参照されている数
のカウンタをもっている1. 参照される度に +1 、参照が切れる度に -
1 される2. カウンタが 0 になった時点で解放される
参照カウント• メリット– 参照が切れたタイミングで解放処理が行える– 最大停止時間が短い– ポインタをたどる必要がない
• デメリット– 循環参照を回収できない– カウンタの値の増減処理が重い– カウンタに多くのビットが必要– 実装が煩雑
コピー• コピー元のヒープを from-space 、コピー
先のヒープを to-space の二つの領域がある1. ルートからオブジェクトをたどりながら、
オブジェクトを from から to へコピーする
2. コピーが終わると、 from 内のオブジェクトをすべて捨てる
コピー• メリット– スループットがいい– メモリ回収と同時にコンパクションを行える• フラグメンテーションが起きない
– FreeList (ヒープの空き部屋リスト)を使わないため、 allocate 処理が早い
• デメリット– ヒープ領域が余分に取る
HotSpotVM における世代別 GC
• 世代別 GC とは– 「多くのオブジェクトは若くして死ぬ」とい
う経験則– ヒープ領域を新世代、旧世代というように世
代別にわける– GC を実行するとオブジェクトは歳をとる– ある閾値を超えるとオブジェクトは旧世代へ
と移動する– 新世代領域を頻繁に GC する
Tenured
Suvivor2
Eden
ヒープ領域
Suvivor1
Yang
Old
GC の種類• Scavenge GC– コピー GC
• Full GC– マーク & スイープ GC
Scavenge GC
Scavenge GC
Scavenge GC
その他• Young 領域に対するパラレル GC• Old 領域に対するパラレル GC• Mostly Concurrent Mark & Sweep GC ( M-
CMS )– ほとんどの過程を並列化
• G1GC ( Garbage-First GC )