SlideShare a Scribd company logo
1 of 191
Download to read offline
GC黄金時代
                            関西GCKaigi02

                           nari/中村 成洋
                          ネットワーク応用通信研究所




Powered by Rabbit 0.6.2
自己紹介
自己紹介
 nari/中村成洋と申します
   ブログ「I am Cruby!」 id:authorNari
   twitter @nari3

 Rubyのコミッタ
   「GCについて考える人」

 GCアルゴリズム詳細解説
   http://wiki.livedoor.jp/author_nari/


                                          2/190
注意
GCがかなり好きです
自分歴史
 高校卒業(機械科)
 アイス工場勤務(3年)
 コンピュータスクール(半年)
 福岡のIT企業(2年)
 NaCl <- イマココ




                  4/190
GCの教育は受けてません
     ので
テキトーな事をいうかもしれ
     ません
    m(_ _)m
島根の方から来ました




             6/190
松江の方から来ました




             7/190
せっかく大阪にきたので
   大事なこと
島根は鳥取の左です!




             9/190
あんまり覚えて貰えない
(住んでる本人も忘れる)
覚え方
お茶碗を持つ方が島根
 お箸を持つ方が鳥取
株式会社ネットワーク応用通信
研究所(NaCl)に所属




            12/190
会社紹介
Q:何をやっている会社なの
      か?
A:普通にRailsアプリ等々の
受託開発を行っております
会社のメンバ
Rubyに詳しい人がいる




前田修吾さん

               17/190
RubyによるMacOSXデスクトッ
プ開発に詳しい人がいる




高尾宏治さん


                18/190
WEBrickに詳しい人がいる




後藤裕藏さん




                  19/190
GCに詳しい人がいる




松本行弘さん
             20/190
奇妙な言語に詳しい人がいる




原悠さん(yhara先生)
                21/190
まだまだ紹介しきれない人々
が!
 卜部さん
 西田雄也さん
 斉藤登さん
 etc..
 おまけ:nariさん


              22/190
注意(1)
Ruby 1 : 9 GC
Rubyの話は
あまりしません
おおらかな関西のRubyist
さんは許してくれますよね。
別にRubyの話しなくても…
もし、RubyのGCを詳しく知りた
かったら…




http://www.nicovideo.jp/watch/sm3740599
                                     27/190
もし、RubyのGCを詳しく知りた
かったら…
 RHG(良書)
 レアでアレなGCの話 - RubyistMagazine
    http://jp.rubyist.net/magazine/?0025-
    RareAreGCTalk

 narihiro.info
    http://www.narihiro.info/



                                            28/190
注意(2)
GCの話を50分するのはは
     じめて
しかも最後のセッション…
関西RubyKaigi02は
チャレンジングですね
  (^q^)アウー
注意(3)
このセッションでは
1分間に5回「GC」と言いま
      す
つまり
50分250回「GC」
あなたは一日に250回
「GC」という単語を人の口
から聞いたことがあります
      か?
「こ、これは、一生に一度あ
  るかのチャンスッッ!」
  (逆に考えるんだ…)
しっかり聞いてください
注意(4)
narioは今日走りません
 (京都が近いしね…)
そろそろnarioのことは忘れ
    てください
      ><
緊急アンケート
GCって何って人?
    ノシ
GCが好きな人?
   ノシ
予想:5人
GCのコード書いた
    or
  読んだ人?
    ノシ
予想:3人
RubyのGC読んだことある
      人?ノシ
parse.yより
gc.cですよね!
GC黄金時代
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 53/190
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 54/190
GCとは?
Wikipedia
  プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的
  に解放する機能である。

  ガベージコレクション-Wikipedia-




                                  56/190
つまり、ゴミを勝手に片付け
   てくれるよい奴
GCの立ち位置




          58/190
最近の言語にはほぼ搭載
 Ruby
 Perl
 Java
 Haskell
 OCaml
 etc..


              59/190
モダンな言語の
  条件の一つ
「GCがあること」
非常に身近な存在
 空気のようなもの
 GCを搭載したJavaからプログラミングを学ぶ人
 多数
 メモリ?はぁ?世代
 実は僕も。。
 知らない所で大変お世話になっている



                       61/190
ただ
身近すぎて気づかない
 (灯台もと暗し)
地味
 あって当たり前
 ゴミ掃除してなんぼ
 たまにバグで仕返し




             64/190
地味なGCが好き
よく質問される
「なんで
GC好きなんですか?」
これを聞かれると困る…
(好きなものは好きなんで
      す)
「なんで
GC好きなんですか?」
「運命です」
注意
電波
自分的にはかなり納得
でも、相手も納得する
理由も考えてみよう…。
思い返してみると…。
GCは
「なんか気になる存在」
GarbageCollector = ゴミ
       収集人
リアルな世界(1)




ゴミは住人が家の中のゴミを集めて
                   79/190
リアルな世界(2)




住人が家の外に出す(この時点で掃除は解決している)
                      80/190
リアルな世界(3)




リアルGCが取りに来る(GC終了)
                    81/190
GCな世界(1)




住人が家の中を散らかす
              82/190
GCな世界(2)




勝手にGCが入ってくる
              83/190
GCな世界(3)




勝手にゴミっぽいもの集めて捨てに行く
                     84/190
か、勝手になにやってんの!?




             85/190
すごく「気になる」存在
「なんで
GC好きなんですか?」
「知的好奇心と
知的欲求を満たすため」
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 89/190
GCのアルゴリズムは3種類に
分類される
 参照カウント
 トレーシングGC
  マークスイープGC
  コピーGC




              90/190
GCアルゴリズムの説明
参照カウント



オブジェクトの被参照数をカウント




                   92/190
特徴
 Cプログラマは一番なじみがある
 C++のsmart pointerも参照カウント
 採用言語
     Python
     Perl




                            93/190
メリット
 リアルタイム性が高い
  まったく参照されなくなった瞬間にオブジェクトが解放
  される
  負荷が分散




                        94/190
デメリット
 カウンタの増減をある程度プログラマが行う
  解放漏れの可能性

 循環参照




                        95/190
循環参照



お互いがお互いを参照し合うため、被参照数が0になら
ない
メモリリーク!



                      96/190
巨大な循環参照オブジェクト群




            97/190
マークスイープGCと組み合
  わせるのが一般的
マークスイープGC
基本的な考え
 プログラムから到達できるオブジェクトは確実に
 使用中(生きている)
  具体的にはマシンスタック、レジスタ、グローバル変数内
  から参照(ポインタ)があるオブジェクトがある場合

 それらのオブジェクトの子オブジェクトは生きてい
 る
 子オブジェクトの子オブジェクトは生きている…つ
 づく


                        100/190
マークフェーズ




スタック、レジスタ内の参照を「起点」とする
マーク、マーク

                        101/190
マークフェーズ




生きているオブジェクトと死んでいるオブジェクトが分け
られる
                      102/190
ルート
 オブジェクトをトレースする「起点」となる領域
  レジスタ、スタック、グローバル変数等々

 トレーシングGCはルートをトレースの「起点」とす
 る




                        103/190
スイープフェーズ




マーク有り => マークを消す
マーク無し => 解放
                  104/190
採用事例
 Ruby
 HotspotVM
 etc..




             105/190
メリット
 実装が簡単
 保守的GCとの相性が良い(あとで説明)




                       106/190
デメリット
 フラグメンテーションが発生しやすい
  虫食い状態

 オブジェクトのアロケーションが遅くなる
  虫食い状態から適切なサイズを確保しなければならな
  い




                       107/190
コピーGC
同じサイズのメモリ領域を二つ
用意




            109/190
アロケーションは常に一つの領
域




            110/190
いっぱいになったらコピー




               111/190
メリット
 トレースとコピーを同時にできる(速い)
  マークスイープは、マーク、スイープと2パス

 フラグメンテーションがない
 アロケーションも速い




                          112/190
デメリット
 2倍のメモリ領域が必要
 保守的GCとの相性が最悪




                113/190
ここからは難しい話
保守的GCとは?
ルート内のオブジェクトアドレス
探索
 スタック、レジスタの中身はただのビット列
 その中でオブジェクトのアドレスを見つける
  条件:オブジェクトヒープの範囲内
  条件:オブジェクトアライメント

 すり抜ける即値がでてくる(数値等の非ポインタ)



                        116/190
マークスイープGCの場合
 即値だったとしてもポインタっぽかったらマーク
 (トレース)する
 怪しい者はマーク!
 本当は死んでいるオブジェクトがマークされる
 保守的な思想 => 「保守的GC」と呼ばれる




                      117/190
コピーGCの場合




オブジェクトが移動
ルート内のポインタを書き換える
                  118/190
書き換えたルート内の
フィールドがもし即値だった
      ら…
    \(^o^)/
保守的GCとコピーGCは相
     性最悪
正確なGCの登場
 即値(数値、非ポインタ)を含まないルート
 オブジェクトのポインタを正確に判断できる
 保守的な部分がない!
 コピーGCもOK




                        121/190
Rubyは?
 マークスイープ&保守的GC
 コピーGCは基本的に作れない
 参照カウントは?
   がんばってください><

 色々制約があるのでいじるのが楽しい




                     122/190
そのほか
 保守的GCを実装した処理系は少ない
 ほとんどが正確なGC
 Rubyはレア




                     123/190
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 124/190
GC黄金時代
まつもとさん曰く
   40年代まで「コンピュータがない」
   50年代まで「プログラミング言語がない」
   60年代まで「アルゴリズムがない」
   70年代まで「(経験の)蓄積がない」
   80年代まで「ネットがない」
   90年代まで「性能がない」




                          126/190
そして21世紀。
性能・価格が十分に。
 リテラシーも向上。
まさに時は
プログラミング黄金時代
ではGCの黄金時代は?
結論
もう過ぎました
60年代〜80年代が
  GC黄金時代
大きく見ると
  世の中にある
GCアルゴリズムは
その時代に作られた
研究の組み合わせ
GCの誕生
1960年、John MacCarthy




 マークスイープの誕生


                   135/190
経緯
 Lisp処理系にメモリ解放用の関数があった
 リスト構造が複雑だからつかうのが難しい
 ('-')つ[マークスイープGC]
 え、いいねそれ




                       136/190
初出し論文
 我々はこの機能をGarbageCollectionと呼んでいる。
 しかし、この論文にその名前は使わないことにした。
 もし使おうとすれば、言葉遣いにうるさい研究所の女性達が私を止めただろう。


 Recursive Functions of Symbolic
 Expressions and Their Computation by
 Machine, Part 1




                                    137/190
驚くほど完成されたアルゴ
     リズム
1960年、Geoge E Collins
  参照カウント




                    139/190
経緯
 マークスイープ?
 効率悪いねー
 ('-')つ[参照カウント]
 え、いいねそれ




                  140/190
初出し論文
 McCarthyの解決法は確かに美しいよ。でも、この方法は非効率だね。


 A Method for Overlapping and Erasure of
 Lists




                                     141/190
3年後
循環参照問題発覚
    orz
1963年、Marvin Minsky
  コピーGC
  論文を読むと二つ目の記憶領域はテープ!!




                      143/190
たった3年でGCの基礎がで
   きあがっている
それから現在までは改良の
   歴史なのです
GCは古い技術
 GCの歴史はRubyより古い
 約50年前からあって、ずーっと使われ続けている
 逆に考えると「勉強しても損はなさそう!」
 火は消えていない




                        146/190
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 147/190
GCの未来について考えて
     みた
GCの未来
 これから多くのGCが実装されるだろう
 なぜならモダンな言語にGCは必須だから
 ほとんどのGCは言語オーダーメイド
  言語の特性にあったGC




                       149/190
どんどんGCは実装される
結論
GCのアルゴリズム的な黄
 金時代は過ぎ去った
しかし、実装的な
黄金時代はこれからだ!
GC再誕
禁句
これってつまり「プログラミ
ング(実装)黄金時代」です
      か?
お釈迦様の手のひらを飛ん
   でいたのか!
     ><
GCアルゴリズムの進化(未
     来編)
GCアルゴリズムの進化(未来
編)
 言語にGCを実装する
 ある問題にぶつかる
 問題を回避するための工夫
 それ一般化できるんじゃね?
 実装の先行のアルゴリズムが増えてくる


                      158/190
これからは
「GCプログラミング黄金時
      代」
新しいGCアルゴリズムが生
     まれる
GCにはニーズがある
ニーズがあれば技術は革
     新する
(新しいアルゴリズム etc..)
若干の不安
 大容量ストレージが安価になっている
  ゴミとか放っておけばよいという考え
  GCは不要?

 それでも行儀の悪いプログラムはある
  ストレージは有限、いつかは枯渇する
  状況にあったGCが必要となる




                      162/190
具体的な未来
SSD
 近々の変化としてSSD
 高速なストレージへのアクセス
 時代にあったGCが必要になる




                  164/190
並列性
 CPUコアの並列化
 言語処理系の並列化
 GCも並列化していく
  すでにしているものもある




                 165/190
ハードウェア
 ハードウェアがGCをサポート
 実例もあり
  Pauseless GC
  http://www.nminoru.jp/~nminoru/java/cms/
  pauseless_gc.html




                                       166/190
機械学習の組み込み
 学習
  オブジェクトの中身
  アロケーション時のバックトレース

 オブジェクトの寿命を学習
 それぞれの寿命にあったGCを行う




                     167/190
「他にもこんな未来がある
かも!」って人は声をかけて
     ください
      ><
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 169/190
おまけ:RubyGCの未来
最新のトピック
 「Ruby のメモリ管理の改善」
   笹田耕一先生
   ヒープサイズを上手く調整する

 「世代別Mostly-Copying GCのRuby VMへの
 実装に向けて」
   永原さん、鵜川さん、岩崎さん
   詳細は知らない(汗)



                            171/190
なんやかんや
でよくなりますね!
個人的なハックTODO
 TODO: LazySweep(起動オプション付き)
 TODO: マークに再帰を使わない
 TODO: 賢くヒープスロットを使う
 TODO: BoehmGCを組み込んだRuby




                           173/190
RubyGCの話、終わり
続きはRubyKaigi2010で
    (たぶん)
今日のアジェンダ
 GCとは
 GC三種の神器
 GC黄金時代
 GCの未来
 おまけ:RubyGCの未来
 まとめ


                 176/190
まとめ
まとめ
 GCは「何か気になる存在」
 アルゴリズム的な黄金時代は過ぎた
 これからはどんどん実装していこう




                    178/190
最後に宣伝
GC本のお話
GC本
 GCの過去と未来を繋ぐ本
  壮大な宣伝ではない

 内容
  アルゴリズム 3:7 実装
  初心者にも優しい
  様々な処理系のGCを紹介
  Python,Rubinius,DalvikVM,V8,hotspotVM
      死にそうです(後悔してます)

                                          181/190
来年中には何とか出したい
     です
大問題
誰が買うんだ?
まつもとさん曰く
    言語処理系を作る人は買うべき




                     185/190
3000人くらい居ますよね?
アンケート
買ってくれる人
   ノシ
ご静聴
ありがとうございました!
質疑応答

More Related Content

Viewers also liked

G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
Narihiro Nakamura
 
第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた
chonaso
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
Narihiro Nakamura
 
われわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできるわれわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできる
Narihiro Nakamura
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
chonaso
 

Viewers also liked (20)

RUBYLAND
RUBYLANDRUBYLAND
RUBYLAND
 
G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」G1GCへ伸びていた「いばらの道」
G1GCへ伸びていた「いばらの道」
 
GC FAQ
GC FAQGC FAQ
GC FAQ
 
Ruby's GC 20
Ruby's GC 20Ruby's GC 20
Ruby's GC 20
 
Symbol GC
Symbol GCSymbol GC
Symbol GC
 
第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた第七回 渋谷Java - Apache Shiroを使ってみた
第七回 渋谷Java - Apache Shiroを使ってみた
 
GC本をGCしないための100の方法
GC本をGCしないための100の方法GC本をGCしないための100の方法
GC本をGCしないための100の方法
 
Java hotspot vmに おけるGCの振る舞い
Java hotspot vmにおけるGCの振る舞いJava hotspot vmにおけるGCの振る舞い
Java hotspot vmに おけるGCの振る舞い
 
円環の理(Garbage Collection)
円環の理(Garbage Collection)円環の理(Garbage Collection)
円環の理(Garbage Collection)
 
われわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできるわれわれは、GCをX倍遅くできる
われわれは、GCをX倍遅くできる
 
CRubyGCの並列世界
CRubyGCの並列世界CRubyGCの並列世界
CRubyGCの並列世界
 
Rubyによる本気のGC
Rubyによる本気のGCRubyによる本気のGC
Rubyによる本気のGC
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
Javaのプログラムはどうやって動いているの? GC編
Javaのプログラムはどうやって動いているの? GC編Javaのプログラムはどうやって動いているの? GC編
Javaのプログラムはどうやって動いているの? GC編
 
地獄のGC本スピンオフ
地獄のGC本スピンオフ地獄のGC本スピンオフ
地獄のGC本スピンオフ
 
第九回渋谷Java RaspberryPi+Javaを試してみる
第九回渋谷Java RaspberryPi+Javaを試してみる第九回渋谷Java RaspberryPi+Javaを試してみる
第九回渋谷Java RaspberryPi+Javaを試してみる
 
Fxxking gc.c
Fxxking gc.cFxxking gc.c
Fxxking gc.c
 
GCが止まらない
GCが止まらないGCが止まらない
GCが止まらない
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 

More from Narihiro Nakamura

シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
Narihiro Nakamura
 
GC生誕50周年を祝って
GC生誕50周年を祝ってGC生誕50周年を祝って
GC生誕50周年を祝って
Narihiro Nakamura
 
シャイなRubyistにできること
シャイなRubyistにできることシャイなRubyistにできること
シャイなRubyistにできること
Narihiro Nakamura
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
Narihiro Nakamura
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object
Narihiro Nakamura
 
Talk In Point Of Gc Once In While
Talk In Point Of Gc Once In WhileTalk In Point Of Gc Once In While
Talk In Point Of Gc Once In While
Narihiro Nakamura
 

More from Narihiro Nakamura (14)

桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 
Parallel worlds of CRuby's GC
Parallel worlds of CRuby's GCParallel worlds of CRuby's GC
Parallel worlds of CRuby's GC
 
シャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできることシャイなRubyistがRubyKaigiでできること
シャイなRubyistがRubyKaigiでできること
 
GC生誕50周年を祝って
GC生誕50周年を祝ってGC生誕50周年を祝って
GC生誕50周年を祝って
 
GC本のツクリカタ
GC本のツクリカタGC本のツクリカタ
GC本のツクリカタ
 
シャイなRubyistにできること
シャイなRubyistにできることシャイなRubyistにできること
シャイなRubyistにできること
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
 
Androidの中身-第26回NaCl社内勉強会
Androidの中身-第26回NaCl社内勉強会Androidの中身-第26回NaCl社内勉強会
Androidの中身-第26回NaCl社内勉強会
 
絶対復習について
絶対復習について絶対復習について
絶対復習について
 
AlgorithmDesign01
AlgorithmDesign01AlgorithmDesign01
AlgorithmDesign01
 
make of MiniGC
make of MiniGCmake of MiniGC
make of MiniGC
 
本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object本当は怖いObjectSpace.each_object
本当は怖いObjectSpace.each_object
 
Talk In Point Of Gc Once In While
Talk In Point Of Gc Once In WhileTalk In Point Of Gc Once In While
Talk In Point Of Gc Once In While
 
Rubyはゲームの夢を見るか
Rubyはゲームの夢を見るかRubyはゲームの夢を見るか
Rubyはゲームの夢を見るか
 

GC黄金時代