Upload
nishimoto-keisuke
View
2.082
Download
6
Embed Size (px)
DESCRIPTION
GC Emulator by Scala language.
Citation preview
2010/05/08 Scalaで実装するGC 2
お品書き
➔ 自己紹介➔ 概要➔ デモ➔ まとめ
2010/05/08 Scalaで実装するGC 3
自己紹介
➔ 緒言➔ 西本 圭佑 (NISHIMOTO Keisuke)➔ [email protected]➔ Twitter: keisuke_n
➔ 仕事➔ Web・デスクトップアプリの開発・支援
➔ 趣味➔ 単なる*プチ*鉄ヲタ (旅行したい)
2010/05/08 Scalaで実装するGC 4
GCとは
➔ 「お客様の中で、GCに詳しい方はいらっしゃいませんか?」
➔ 「特にGCを日常的に実装している方を探しています!」
2010/05/08 Scalaで実装するGC 5
GCとは
➔ ガベージコレクション(garbage collection; GC)➔ プログラムが動的に確保したメモリ領域のうち、不要に
なった領域を自動的に解放する機能➔ 「ガベージコレクション」を直訳すれば「ゴミ収集」➔ 1959年ごろ、LISPにおける問題を解決するためジョン・
マッカーシーによって発明された。➔ (Wikipedia(ja)より)
2010/05/08 Scalaで実装するGC 6
デモ: お品書き
➔ GCDemo➔ コンセプト➔ 画面構成➔ 仕様➔ メモリモデル➔ コードリーディング
➔ 参照カウント(Reference Counting)➔ マークアンドスイープ(mark-and-sweep)➔ コピーGC(Copy GC)
2010/05/08 Scalaで実装するGC 7
デモ: 実装方針
➔ 大まかにGCを実装してみる➔ こまけーことはいいんだYo!➔ 代表的GC: 参照カウント / マーク&スイープ / コピー
➔ 可視化する➔ 物理演算の導入, 簡単なObjectの操作
➔ 富豪的プログラミング➔ 実行効率やリソースは無視
➔ 副作用バリバリバリ(やめて~➔ モナド使って副作用を避け...漢らしくやめました!
2010/05/08 Scalaで実装するGC 8
デモ: 画面構成
Object Refernces
Memory Image
Control Panel
2010/05/08 Scalaで実装するGC 9
デモ: 仕様
➔ 動作環境➔ Java SE 6
➔ 使用言語➔ Scala 2.7.7.final
➔ 主なテクノロジ➔ Java2D / Swing (GUI)➔ Scalaランタイム(コレクション)
2010/05/08 Scalaで実装するGC 10
デモ: メモリモデル
➔ Memory: ヒープ相当➔ 32Node分の大きさ*2領域
➔ Nodeインスタンスを配置
➔ Node: オブジェクト➔ Tag + Field➔ Memory上の大きさは常に1
➔ Tag: Node基本情報➔ 参照数, 生死
➔ 速度/座標(過去+現在)
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 }
}
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 }
}
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) }
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 // 殺すオブジェクトを返す...
2010/05/08 Scalaで実装するGC 15
まとめ
➔ GCの原理はそんなに難しくない➔ 仮想環境の定義は(リアルにするほど)難しい
➔ 可視化は有意義かも!?➔ 試行錯誤してると様々な問題が見つかる➔ そのままDrawツール作れそうだw
➔ 物理演算は必要なのか?➔ もちろんw➔ 今回は自動レイアウトをさせるために導入した
2010/05/08 Scalaで実装するGC 16
まとめ
GCと
エミュレーションと
可視化
結構面白いかも
2010/05/08 Scalaで実装するGC 17
おわり
ご清聴ありがとうございました
2010/05/08 Scalaで実装するGC 18
質疑応答
Any Questions?
2010/05/08 Scalaで実装するGC 19
GCDemoについて
➔ GCDemo➔ GCエミュレータ
➔ http://cappuccino.jp/keisuken/logbook/20100508.html#p01➔ ○をクリックすると選択
➔ ○をダブルクリックすると削除
➔ 何もないところでクリックすると選択解除
➔ 何もないところでダブルクリックするとオブジェクト生成
➔ 選択して次の○をクリックすると、参照関係がひける
➔ 範囲選択するとその範囲のオブジェクトは削除
➔ [Clear]で初期状態➔ リストでGCアルゴリズム選択
➔ [GC]でGC実行
➔ その他秘密機能搭載!