Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Mark Compact GC in MRI
Search
Aaron Patterson
June 13, 2017
Technology
4
1.1k
Mark Compact GC in MRI
My presentation about Mark Compact GC in MRI for GitHub Constellation Tokyo
Aaron Patterson
June 13, 2017
Tweet
Share
More Decks by Aaron Patterson
See All by Aaron Patterson
RubyKaigi 2025: Class New, A New Approach
tenderlove
0
82
RubyKaigi Dev Meeting 2025
tenderlove
1
3.4k
Speeding up Instance Variables in Ruby 3.3
tenderlove
2
450
[Feature #20425] Speeding up delegate methods
tenderlove
3
280
RailsConf 2023
tenderlove
30
1.2k
Don't @ Me! Faster Instance Variables with Object Shapes
tenderlove
1
470
RailsConf 2022 Keynote
tenderlove
2
570
Some Assembly Required
tenderlove
1
580
HexDevs 2021
tenderlove
1
480
Other Decks in Technology
See All in Technology
Agile PBL at New Grads Trainings
kawaguti
PRO
1
430
Practical Agentic AI in Software Engineering
uzyn
0
110
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
260
AI開発ツールCreateがAnythingになったよ
tendasato
0
130
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
220
S3アクセス制御の設計ポイント
tommy0124
3
200
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
170
いま注目のAIエージェントを作ってみよう
supermarimobros
0
220
自作JSエンジンに推しプロポーザルを実装したい!
sajikix
1
180
TS-S205_昨年対比2倍以上の機能追加を実現するデータ基盤プロジェクトでのAI活用について
kaz3284
1
150
allow_retry と Arel.sql / allow_retry and Arel.sql
euglena1215
1
170
AIエージェント開発用SDKとローカルLLMをLINE Botと組み合わせてみた / LINEを使ったLT大会 #14
you
PRO
0
120
Featured
See All Featured
Being A Developer After 40
akosma
90
590k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Practical Orchestrator
shlominoach
190
11k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Designing for humans not robots
tammielis
253
25k
Transcript
How people build software ! " Mark Compact GC in
MRI
How people build software ! ͜Μʹͪʂʂʂ 2
How people build software ! ࣗݾհ 3
How people build software ! ΞʔϩϯͰ͢ɻ! 4
How people build software ! ˏtenderlove 5
How people build software ! ! ˏtenderlove 6
How people build software ! ఱက͕େ͖Ͱɺ 7 ఱကϥϒΛݺΜͰ͍͍Ͱ͢
How people build software ! Ruby Core Team Rails Core
Team 8
How people build software ! ຊޠೳྗࢼݧ 9
How people build software ! ೣɺೋඖ 10
How people build software ! 11 SEATAC Airport Facebook YouTube
How people build software ! 12
How people build software ! 13 Gorbachev Puff Puff Thunderhorse
ΰϒͪΌΜ
How people build software ! GitHub ͷࣾһ 14
How people build software ! Ruby & Rails Developer 15
How people build software ! GitHub & OSS 16
How people build software ! ! GitHub Core Values 17
• Collaboration • Empathy • Quality • Positive Impact • Shipping
How people build software ! Collaboration 18 !
How people build software ! Empathy 19 !
How people build software ! Quality 20 !
How people build software ! Positive Impact 21 !
How people build software ! Shipping 22 !
How people build software ! GitHub ❤ OSS 23 !
How people build software ! GitHub & OSS 24 !
How people build software ! Mark / Compact GC 25
How people build software ! Mark / Compact GC 26
How people build software ! ! Roadmap 27 Ξϩέʔγϣϯ ίϨΫγϣϯ
ίϯύΫτ
How people build software ! Ξϩέʔγϣϯ 28
How people build software ! ! Ξϩέʔγϣϯ 29 def hoge
loop do Object.new end end hoge
How people build software ! Ξϩέʔγϣϯ GCͷ 30
How people build software ! `rb_newobj` in gc.c 31
How people build software ! ! ϝϞϦྖҬͷϨΠΞτ 32 ώʔϓྖҬ ϖʔδ
ϖʔδ ϖʔδ ϖʔδ ϖʔδ ϖʔδ ϖʔδ ϖʔδ Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! Free Space = "Fast Path"
33
How people build software ! New Page = "Slow Path"
34
How people build software ! ! ϖʔδͷϨΠΞτ 35 ϖʔδ FREE
FREE FREE FREE FREE FREE FREE FREE FREE FREE SLOTS Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! ! ϖʔδͷϨΠΞτ 36 ϖʔδ FREE
FREE FREE FREE FREE FREE FREE FREE FREE FREE SLOTS Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! ཁ 37
How people build software ! heap has_many :pages 38
How people build software ! page has_many :slots 39
How people build software ! slot.is_a?(Empty) || slot.is_a?(Object) 40
How people build software ! ίϨΫγϣϯ 41
How people build software ! ϚʔΫεΠʔϓ GC Mark Sweep GC
42 !
How people build software ! ϚʔΫεΠʔϓͷ ΞϧΰϦζϜ 43
How people build software ! ! Tree of Objects 44
Root A B C D a = [ { c: 'd' } ] Ruby Array Hash String Symbol
How people build software ! ! Tree of Objects 45
Root A B C D a = [ { c: 'd' } ] a = nil Ruby
How people build software ! ϚʔΫɹεΠʔϓ 46 ͔ͩΒʮϚʔΫεΠʔϓʯɹ tenderlove
How people build software ! ! Mark Phase 47 Root
D A B C F E H G
How people build software ! ! Mark Phase 48 Root
D A B C F E H G
How people build software ! ! Mark Phase 49 Root
D A B C F E H G
How people build software ! ! Mark Phase 50 Root
D A B C F E H G
How people build software ! Incremental / Lazy 51
How people build software ! ίϯύΫγϣϯͷؔ 52
How people build software ! ! Free Space 53 ϖʔδ
FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj ϖʔδ FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj ϖʔδ FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! ! Free Space 54 FREE
FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! ! Free Space 55 FREE
FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj FREE FREE FREE FREE FREE FREE FREE FREE FREE FREE Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj Obj
How people build software ! ΦϒδΣΫτҠಈग़དྷͳ͍ 56
How people build software ! ίϯύΫγϣϯͱ 57
How people build software ! github.com/github/ruby/tree/gc-compact 58
How people build software ! ίϯύΫγϣϯͷ ΞϧΰϦζϜ 59
How people build software ! "2 Finger Compaction" 60 ☝
☝
How people build software ! ! Compaction Steps 61 ΦϒδΣΫτͷҠಈ
ϦϑΝϨϯεͷߋ৽
How people build software ! ! ΦϒδΣΫτͷҠಈ 62 1 2
3 4 5 6 7 8 9 a b Free Free Free Obj Free Obj Obj Obj Free Free Obj ☝ ☝ Free Pointer Scan Pointer 1 2 3 5 Done! Address Heap
How people build software ! ! ΦϒδΣΫτҠಈͷલ 63 1 2
3 4 5 6 7 8 9 a b Free Free Free Obj Free Obj Obj Obj Free Free Obj Address Heap a = { c: 'd' } Ruby {} :c 'd'
How people build software ! ! ΦϒδΣΫτҠಈͷޙ 64 1 2
3 4 5 6 7 8 9 a b Obj Free Obj Obj Obj Free Free Obj Address Heap a = { c: 'd' } Ruby {} :c 'd' 1 2 3 5
How people build software ! ! ϦϑΝϨϯεͷߋ৽ 65 1 2
3 4 5 6 7 8 9 a b Obj Obj Obj Obj Free Free Obj Address Heap a = { c: 'd' } Ruby {} :c 'd' 1 2 3 5 ☝ Done!
How people build software ! ! ϦϑΝϨϯεͷߋ৽ 66 1 2
3 4 5 6 7 8 9 a b Obj Obj Obj Obj Free Free Obj Address Heap a = { c: 'd' } Ruby {} :c 'd' 1 2 3 5 Free Free Free Free
How people build software ! ίϯύΫτྃʂʂ 67
How people build software ! ίϯύΫγϣϯͷ 68
How people build software ! ! ී௨ͷϦϑΝϨϯε 69 Hash Symbol
String C code
How people build software ! ! C֦ுͷϦϑΝϨϯε 70 Hash Symbol
String C code rb_gc_mark ෆҠಈ Ҡಈ Ҡ ಈ
How people build software ! άϩόϧม 71
How people build software ! ! file.c in MRI 72
separator = rb_obj_freeze(rb_usascii_str_new2("/")); /* separates directory parts in path */ rb_define_const(rb_cFile, "Separator", separator); rb_define_const(rb_cFile, "SEPARATOR", separator); static VALUE rb_file_s_join(VALUE klass, VALUE args) { return rb_file_join(args, separator); } άϩόϧม
How people build software ! ! άϩόϧม - SEGV 73
$ ruby -e'File::Separator = File::SEPARATOR = nil; GC.start; File.join("a", "b")' # BOOM $ jruby -e'File::Separator = File::SEPARATOR = nil; GC.start; File.join("a", "b")'
How people build software ! General Problem 74
How people build software ! ݁Ռ 75
How people build software ! Rails Heap 76
How people build software ! ! Compaction Code 77 GC.start
File.open("pre_compact.json", "wb") { |f| ObjectSpace.dump_all(output: f) } GC.start p GC.compact GC.start File.open("post_compact.json", "wb") { |f| ObjectSpace.dump_all(output: f) } $ ruby bin/rails r script.rb
ίϯύΫτͷલ F U P Pages Number of slots 0 100
200 300 400
ίϯύΫτͷޙ F U P Pages Number of slots 0 100
200 300 400
How people build software ! ίϯύΫτͷલ: 528 / 552 80
How people build software ! ίϯύΫτͷޙ: 167 / 552 81
How people build software ! ͰɺվળͰ͖·͢ 82
How people build software ! GitHub Heap Graphs 83
None
How people build software ! ·ͱΊ 85 !
How people build software ! Why Compact? 86 !
How people build software ! OSS Software https://github.com/github/ruby/tree/gc-compact 87 !
How people build software ! ͋Γ͕ͱ͏͍͟͝·͢ʂ 88
How people build software ! "