19
ガベージコレクションのアルゴリズムと実装読書会@大阪: 2010/05/08 () 西本圭佑 (NISHIMOTO Keisuke) [email protected] で実装する で実装する GC GC

Scalaで実装するGC

Embed Size (px)

DESCRIPTION

GC Emulator by Scala language.

Citation preview

Page 1: Scalaで実装するGC

ガベージコレクションのアルゴリズムと実装読書会@大阪: 2010/05/08 (土)

西本圭佑 (NISHIMOTO Keisuke)[email protected]

で実装するで実装するGCGC

Page 2: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 2

お品書き

➔ 自己紹介➔ 概要➔ デモ➔ まとめ

Page 3: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 3

自己紹介

➔ 緒言➔ 西本 圭佑 (NISHIMOTO Keisuke)➔ [email protected]➔ Twitter: keisuke_n

➔ 仕事➔ Web・デスクトップアプリの開発・支援

➔ 趣味➔ 単なる*プチ*鉄ヲタ (旅行したい)

Page 4: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 4

GCとは

➔ 「お客様の中で、GCに詳しい方はいらっしゃいませんか?」

➔ 「特にGCを日常的に実装している方を探しています!」

Page 5: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 5

GCとは

➔ ガベージコレクション(garbage collection; GC)➔ プログラムが動的に確保したメモリ領域のうち、不要に

なった領域を自動的に解放する機能➔ 「ガベージコレクション」を直訳すれば「ゴミ収集」➔ 1959年ごろ、LISPにおける問題を解決するためジョン・

マッカーシーによって発明された。➔ (Wikipedia(ja)より)

Page 6: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 6

デモ: お品書き

➔ GCDemo➔ コンセプト➔ 画面構成➔ 仕様➔ メモリモデル➔ コードリーディング

➔ 参照カウント(Reference Counting)➔ マークアンドスイープ(mark-and-sweep)➔ コピーGC(Copy GC)

Page 7: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 7

デモ: 実装方針

➔ 大まかにGCを実装してみる➔ こまけーことはいいんだYo!➔ 代表的GC: 参照カウント / マーク&スイープ / コピー

➔ 可視化する➔ 物理演算の導入, 簡単なObjectの操作

➔ 富豪的プログラミング➔ 実行効率やリソースは無視

➔ 副作用バリバリバリ(やめて~➔ モナド使って副作用を避け...漢らしくやめました!

Page 8: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 8

デモ: 画面構成

Object Refernces

Memory Image

Control Panel

Page 9: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 9

デモ: 仕様

➔ 動作環境➔ Java SE 6

➔ 使用言語➔ Scala 2.7.7.final

➔ 主なテクノロジ➔ Java2D / Swing (GUI)➔ Scalaランタイム(コレクション)

Page 10: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 10

デモ: メモリモデル

➔ Memory: ヒープ相当➔ 32Node分の大きさ*2領域

➔ Nodeインスタンスを配置

➔ Node: オブジェクト➔ Tag + Field➔ Memory上の大きさは常に1

➔ Tag: Node基本情報➔ 参照数, 生死

➔ 速度/座標(過去+現在)

Page 11: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 11

Reference Counting GC

object RefernceCounting extends GCAlgorithm {

def doIt(memory: Memory): Seq[Node] = memory.elements.filter {node => node.tag.count == 0 && node.tag.id != 0 }

}

Page 12: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 12

Mark and Sweep GC

object MarkAndSweep extends GCAlgorithm {

def doIt(memory: Memory): Seq[Node] = memory.elements.filter {node => !node.tag.life }

}

Page 13: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 13

Mark and Sweep GC

// Mark and sweep like check.def lifeCheck(node: Node): Unit = if (node.tag.life) return else { node.tag.life = true for (child <- node.fields) lifeCheck(child) }

Page 14: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 14

Copy GC

... // Fill memory ... コピー先をクリア

... // Compaction and destroy for (node <- memory.elements) { if (node.tag.life) { node.tag.id = newId memory(nextStart + newId) = node newId += 1 } else deathNodes += node } ... deathNodes // 殺すオブジェクトを返す...

Page 15: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 15

まとめ

➔ GCの原理はそんなに難しくない➔ 仮想環境の定義は(リアルにするほど)難しい

➔ 可視化は有意義かも!?➔ 試行錯誤してると様々な問題が見つかる➔ そのままDrawツール作れそうだw

➔ 物理演算は必要なのか?➔ もちろんw➔ 今回は自動レイアウトをさせるために導入した

Page 16: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 16

まとめ

GCと

エミュレーションと

可視化

結構面白いかも

Page 17: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 17

おわり

ご清聴ありがとうございました

Page 18: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 18

質疑応答

Any Questions?

Page 19: Scalaで実装するGC

2010/05/08 Scalaで実装するGC 19

GCDemoについて

➔ GCDemo➔ GCエミュレータ

➔ http://cappuccino.jp/keisuken/logbook/20100508.html#p01➔ ○をクリックすると選択

➔ ○をダブルクリックすると削除

➔ 何もないところでクリックすると選択解除

➔ 何もないところでダブルクリックするとオブジェクト生成

➔ 選択して次の○をクリックすると、参照関係がひける

➔ 範囲選択するとその範囲のオブジェクトは削除

➔ [Clear]で初期状態➔ リストでGCアルゴリズム選択

➔ [GC]でGC実行

➔ その他秘密機能搭載!