137
Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012 2012/9/15 ネットワーク応用通信研究所

Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

Rubyによる本気のGC

Serious GC with Ruby

@nari3#sprk20122012/9/15

ネットワーク応用通信研究所

Page 2: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

提供

Page 3: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

うなぎの件

<URL:https://www.wantedly.com/projects/478>

Page 4: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

自己紹介

中村成洋/@nari3/nari/authorNari✓

CRubyのコミッタ✓

GCメンテナ&デストロイヤ✓

Page 5: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GCとは(ry

Page 6: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GoogleTrendでみるGC

Page 7: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 8: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 9: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 10: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 11: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

休日の検索数がさがっている

Page 12: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

つまり

平日お仕事でGCを作るリア充✓

もしくはGCバグに悩まされる一般ピープルが多い

休日趣味でGCをいじる人が少ない✓

Page 13: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GCはまだまだ愛されていない

Page 14: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

ちなみに:年末も異常に検索されている

リアルGCの恐れ..

Page 15: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

とにかくGCをもっと

よく知りましょう!

Page 16: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

徹底解剖G1GC 実装編正式版公開!!(無料配布)

Page 17: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

この場を借りて本書のスポンサーのみなさまありがとうございます

m(_ _)m

Page 18: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Ruby2.0 の GC update

Page 19: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

偉い人がいってた

Page 20: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

http://www.flickr.com/photos/recompile_net/5952564080http://www.flickr.com/photos/recompile_net/5952564080

「全力で潰す」

Page 21: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Matz mashes something, so we mash something.

Page 22: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

僕もなにか潰したい!

Page 23: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

REE is dead

<URL:http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-life-imminent/>

Page 24: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

諸君らが愛したREEは死んだ。なぜだ!

Page 25: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 26: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 27: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 28: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

BitmapMarking

fork使うようなプログラムで嬉しいはず

Passengerなどで恩恵があるらしい

Page 29: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

REEつぶしたった(^o^)

Page 30: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

最近の悩み: Kijiは

どうやって潰そうか…

Page 31: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

本題

Page 32: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

RubyでGCを書くというお話

Page 33: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

動機(1)

Page 34: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

RubyKaigi Driven Development

Page 35: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

過去のRubyKaigiの発表...

LazySweepGC - RubyKaigi2008✓

LonglifeGC - 2009✓

LazySweepGC - 2010✓

ParallelMarkingGC - 2011✓

Page 36: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

全部Cの話やないか!

Page 37: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyの話、させてください

Page 38: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

動機(2)

Page 39: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 40: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

結論:C死ね。[cited from `卜部昌平のあまりreblogしないtumblr']

Page 41: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

ほんとどのGCはC or C++で書かれている

しなぁ…

Page 42: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

なぜCで書く必要がある?ないはずだよ。ちゃんと調査すればJavaとかC#とか、ひょっとしたらOCamlやScalaででも用は足りる場合がほとんどなんだ。

[cited from `卜部昌平のあまりreblogしないtumblr']

Page 43: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 44: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

RubyでGC書いてみよう!

Page 45: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

素直に考えると...

Page 46: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 47: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 48: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

これはあまり意味がない

下にいるGCの性能に影響をうける性能評価しづらい✓

下のGCが遅いと、上のGCも遅くなる

Page 49: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

これはあまり意味がない

言語処理系にGCは1つあればいいですよ感無駄に話が複雑になっているような気がする

Page 50: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

もっと違うアプローチを考えよう!

Page 51: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Meta-circular evaluator

Page 52: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

An evaluator that is written in the same language that it evaluates is said to be metacircular.

[cited from `4.1 The Metacircular Evaluator - SICP']

Page 53: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

簡単な例:LISPでLISP書いたった

Page 54: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

他の具体例を調べてみる

Page 55: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 56: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

もう少し詳しく

RPython(Restricted Python)で実装

Pythonの言語サブセット✓

RPython -> C/LLVM/Java..✓

Page 57: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

変換イメージ

Page 58: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 59: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 60: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 61: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 62: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

重要なポイント

Page 63: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 64: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GCもRPythonで書かれている

Page 65: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

疑問

Page 66: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

GC動作中のGCはどうするのか?

GC動作中にGCが起きて、その動作中にGCが起きて…

GCの無限ループ...?✓

Page 67: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

RPython

GC中はGC対象のオブジェクトを作らないように気を付ける(たぶん)

mallocなどで直接メモリを切り出すlibffiを利用✓

Page 68: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GC中にGCが走ることはない

Page 69: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 70: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

仕組み(ry

Page 71: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

ただし

GCをRubyで書く仕組みがない今考えればRubiniusをいじったほうがよかったかも…?まぁいいか...✓

Page 72: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 73: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

JikesRVM

RVM(Research Virtual Machine) = 研究用VM

GC,VM周りでたくさん論文が書かれている

Page 74: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

JikesRVM

GCもJavaで書かれている✓

プロジェクト委員の一人がRechard Jones(RJGC著者)

Page 75: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

直接オブジェクトファイルを吐く

Page 76: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

GCもJavaで書ける

一緒にオブジェクトファイルに変換される

GC中はGCが発生しないPyPyと同じ理由✓

Page 77: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

JikesRVMの功績は「GCをJavaでかける」

だけではない

Page 78: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

GC部分がMMTkという別部品に切り離されてい

Page 79: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

MMTk(Memory Management Tool kit)

GCを11個保有✓

ツールキットなのでGC用の便利メソッドが沢山ある

GCづくりが簡単✓

Page 80: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

MMTk(Memory Management Tool kit)

VMからメモリ管理を別の部品として切り離せる

VMは取り替え可能JikesRVM✓

Harness✓

Page 81: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 82: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 83: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 84: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

やたー!GC書き放題!

Page 85: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 86: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Javaで…

Page 87: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyで書きたい…ッ!!

Page 88: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 89: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 90: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

われわれにはJRubyがあるじゃないか

Page 91: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 92: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 93: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

この部分をライブラリ化

Page 94: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Regicide

Page 95: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

Regicde = 国王殺し

Page 96: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 97: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

サンプルコード

Page 98: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

オブジェクトの定義

class FixnumValue < Regicide::Mutator::ObjectValue # ...end

Regicide::Mutator::ObjectValueを継承

Page 99: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

オブジェクト生成

class FixnumValue < Regicide::Mutator::ObjectValue # Fixnumをフィールドに持つ # オブジェクトを割り当てるメソッド def self.from_i(mutator, i) ... endend

Page 100: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

from_i

# メモリ割り当てptr = mutator.alloc(0, 1, mutator.current_stack.pc)# オブジェクト生成v = self.new(ptr)# Fixnumを格納mutator.store_data_field(v.object_value, 0, org.vmmagic.unboxed.Word.from_long(i))return v

Page 101: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

M&S GCは4行で書ける

class MSConstraints < org.mmtk.plan.marksweep.MSConstraints; endclass MS < org.mmtk.plan.marksweep.MS; endclass MSCollector < org.mmtk.plan.marksweep.MSCollector; endclass MSMutator < org.mmtk.plan.marksweep.MSMutator; end

Page 102: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

動作するサンプル↓

<URL:https://github.com/authorNari/regicide/tree/master/sample>

Page 103: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

苦労話

Page 104: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

Java+JRuby

JRuby側からJavaを使うのは簡単メソッド呼び出し✓

継承とかとか✓

Page 105: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

Java+JRuby

Java側からJRubyを使うのは難しいけっこう意外だった✓

Page 106: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

どいうことか?

Page 107: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 108: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 109: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

どうやるの(?_?)

Page 110: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

RedBridge

Page 111: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

RedBridge

@yokoletさん作(感謝!)✓

Javaの中でJRubyの実行環境(コンテナ)を作るコンテナにソースコードぶちこんだり、Rubyコード片を評価できる

Page 112: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 113: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

イメージ

public static void foo(void) { // JRuby実行環境作って ScriptingContainer sc = new ScriptingContainer();

// さっきのJRubyFooクラスを読み込み Object jrubyFooClass = sc.runScriptlet(PathType.ABSOLUTE, "foo.rb");

// JRubyFoo.fooを呼び出す sc.callMethod(fooClass, "foo", Object.class);}

Page 114: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Regicideではこの辺の技術をなんやかんや使ってます

Page 115: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Regicideの悪いところ

Page 116: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

VM作るのめんどい

Page 117: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

けっきょくVMは書かないといけない

GCを評価するためにはある程度ちゃんとしたものが必要でもVMとか興味ないしさぁ…✓

LISPすら作るのが億劫✓

飽きてきた✓

Page 118: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

JVMのGCの影響を受ける

Page 119: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 120: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012
Page 121: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

ふつうにJavaのコードとして動かす感じ

Page 122: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

JVMのGCに引っ張られる

性能が引っ張られるGC停止も不可能だしきちんと性能評価しづらそう論文とか書きづらそう✓

Page 123: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

変換ができればいいのに…

JikesRVMのブートストラップ部分にJRubyを突っ込むうまく動かなかった

JRubyがJikesRVMの秘孔を付いているらしい✓

JikesRVMがまだ未熟✓

Page 124: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Regicideの良いところ

Page 125: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

VMが自分で書ける

Page 126: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

言語処理系が自前で書ける

GCにすごく優しい処理系とか書ける

言語処理系ひっくるめて検討できる

Page 127: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

おいしいところは全部Rubyで書ける

VM, GC, 全部Rubyで書ける✓

Cみたいに阿鼻叫喚しなくていい(かもしれない)

生産性が100倍(らしい)✓

Page 128: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

勝手に処理系が速くなる感

JVM速くなる = Regicide速くなる

WIN-WIN(笑)Cでも一緒か…✓

Page 129: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

ほかのGCと比較可能

十数個のGCと性能比較ができる

起動時のオプションを少しいじるだけでOK論文とかかけるかもしれない!✓

Page 130: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

githubにあげていますauthorNari/regicide

Page 131: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

今後の展開

Page 132: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

作ってみて気づいたこと

GC部分は外っ面がRubyなだけで実はCとあまり変わらない感じ…これならCで書いても一緒なのでは…✓

Page 133: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

作ってみて気づいたこと

実はGC実装に特化したミニ言語が欲しいだけなのか…?今後はそちら方面で攻めてみたい✓

Page 134: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

まとめ

Page 135: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5

まとめ

やっぱりRubyの話できなかった

C死ねと思って作ったRegicideがすでに死にそう

Page 136: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012

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

Page 137: Rubyによる本気の GC - Rabbit Slide Show · Rubyによる本気のGC - Serious GC with Ruby Powered by Rabbit 2.0.5 Rubyによる本気の GC Serious GC with Ruby @nari3 #sprk2012