で実装するGC

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


          西本圭佑 (NISHIMOTO Keisuke)
            keisuken@cappuccino.ne.jp
お品書き
 ➔   自己紹介
 ➔   概要
 ➔   デモ
 ➔   まとめ




2010/05/08   Scalaで実装するGC   2
自己紹介
 ➔   緒言
      ➔      西本 圭佑 (NISHIMOTO Keisuke)
      ➔      keisuken@cappuccino.ne.jp
      ➔      Twitter: keisuke_n
 ➔
     仕事
      ➔      Web・デスクトップアプリの開発・支援
 ➔   趣味
      ➔      単なる*プチ*鉄ヲタ (旅行したい)


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

 ➔
     「お客様の中で、GCに詳しい方はいらっしゃい
     ませんか?」
 ➔
     「特にGCを日常的に実装している方を探し
     ています!」




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

 ➔   ガベージコレクション(garbage collection; GC)
      ➔
             プログラムが動的に確保したメモリ領域のうち、不要に
             なった領域を自動的に解放する機能
      ➔
             「ガベージコレクション」を直訳すれば「ゴミ収集」
      ➔      1959年ごろ、LISPにおける問題を解決するためジョン・
             マッカーシーによって発明された。
      ➔      (Wikipedia(ja)より)




2010/05/08             Scalaで実装するGC       5
デモ: お品書き

 ➔   GCDemo
      ➔      コンセプト
      ➔      画面構成
      ➔
             仕様
      ➔      メモリモデル
      ➔
             コードリーディング
             ➔   参照カウント(Reference Counting)
             ➔   マークアンドスイープ(mark-and-sweep)
             ➔   コピーGC(Copy GC)


2010/05/08                   Scalaで実装するGC     6
デモ: 実装方針

 ➔   大まかにGCを実装してみる
      ➔      こまけーことはいいんだYo!
      ➔      代表的GC: 参照カウント / マーク&スイープ / コピー
 ➔   可視化する
      ➔      物理演算の導入, 簡単なObjectの操作
 ➔   富豪的プログラミング
      ➔
             実行効率やリソースは無視
 ➔   副作用バリバリバリ(やめて~
      ➔      モナド使って副作用を避け...漢らしくやめました!
2010/05/08              Scalaで実装するGC          7
デモ: 画面構成



              Object Refernces




               Memory Image

                Control Panel
2010/05/08      Scalaで実装するGC     8
デモ: 仕様
 ➔   動作環境
      ➔      Java SE 6
 ➔   使用言語
      ➔      Scala 2.7.7.final
 ➔   主なテクノロジ
      ➔      Java2D / Swing (GUI)
      ➔      Scalaランタイム(コレクション)




2010/05/08                       Scalaで実装するGC   9
デモ: メモリモデル

 ➔   Memory: ヒープ相当
      ➔      32Node分の大きさ*2領域
      ➔      Nodeインスタンスを配置
 ➔   Node: オブジェクト
      ➔      Tag + Field
      ➔      Memory上の大きさは常に1
 ➔   Tag: Node基本情報
      ➔      参照数, 生死
      ➔      速度/座標(過去+現在)
2010/05/08                 Scalaで実装するGC   10
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                11
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          12
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    13
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      14
まとめ

 ➔   GCの原理はそんなに難しくない
      ➔      仮想環境の定義は(リアルにするほど)難しい
 ➔   可視化は有意義かも!?
      ➔
             試行錯誤してると様々な問題が見つかる
      ➔      そのままDrawツール作れそうだw
 ➔   物理演算は必要なのか?
      ➔
             もちろんw
      ➔      今回は自動レイアウトをさせるために導入した


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


                GC
                   と
             エミュレーション
                   と
               可視化
             結構面白いかも
2010/05/08     Scalaで実装するGC   16
おわり




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




2010/05/08        Scalaで実装するGC   17
質疑応答




             Any Questions?




2010/05/08      Scalaで実装するGC   18
GCDemoについて

 ➔   GCDemo
      ➔      GCエミュレータ
      ➔      http://cappuccino.jp/keisuken/logbook/20100508.html#p01
              ➔
                  ○をクリックすると選択
              ➔
                  ○をダブルクリックすると削除
              ➔   何もないところでクリックすると選択解除
              ➔   何もないところでダブルクリックするとオブジェクト生成
              ➔   選択して次の○をクリックすると、参照関係がひける
              ➔
                  範囲選択するとその範囲のオブジェクトは削除
              ➔   [Clear]で初期状態
              ➔   リストでGCアルゴリズム選択
              ➔   [GC]でGC実行
              ➔
                  その他秘密機能搭載!


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

Scalaで実装するGC

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