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
Speeding up Instance Variables in Ruby 3.3
tenderlove
2
370
[Feature #20425] Speeding up delegate methods
tenderlove
3
230
RailsConf 2023
tenderlove
29
1k
Don't @ Me! Faster Instance Variables with Object Shapes
tenderlove
1
420
RailsConf 2022 Keynote
tenderlove
2
520
Some Assembly Required
tenderlove
1
530
HexDevs 2021
tenderlove
1
400
Compacting GC for MRI
tenderlove
60
4.5k
But At What Cost?
tenderlove
9
15k
Other Decks in Technology
See All in Technology
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
880
Ruby on Railsで持続可能な開発を行うために取り組んでいること
am1157154
3
190
AWSではじめる Web APIテスト実践ガイド / A practical guide to testing Web APIs on AWS
yokawasa
8
840
人生を左右する「即答」のススメ: 一瞬の判断を間違えないためにするべきこと
takasyou
9
1.3k
Amazon Bedrock 2025 年の熱いアップデート (2025/3 時点)
icoxfog417
PRO
3
480
Quality with Angular: Tools and Processes
rainerhahnekamp
0
110
AI_Agent_の作り方_近藤憲児
kenjikondobai
7
1.7k
事業を差別化する技術を生み出す技術
pyama86
3
1.2k
書籍『入門 OpenTelemetry』 / Intro of OpenTelemetry book
ymotongpoo
10
630
【Forkwell】「正しく」失敗できるチームを作る──現場のリーダーのための恐怖と不安を乗り越える技術 - FL#83 / A team that can fail correctly by forkwell
i35_267
2
180
ライフステージの変化を乗り越える 探索型のキャリア選択
tenshoku_draft
2
380
DevinでAI AWSエンジニア製造計画 序章 〜CDKを添えて〜/devin-load-to-aws-engineer
tomoki10
0
270
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
223
9.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Designing Experiences People Love
moore
140
23k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
400
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
How to Ace a Technical Interview
jacobian
276
23k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
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 ! "