Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Ruby内存管理和垃圾回收
Search
Tongfei Gao
May 12, 2019
Technology
380
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby内存管理和垃圾回收
Tongfei Gao
May 12, 2019
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
290
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
7
5.1k
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
2
310
Browser Spec: Testing Hotwire with Ruby
takahashim
1
130
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
360
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
480
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
780
Getting Started with Google Antigravity
glaforge
0
320
FinOps Agentが生んだ技術負債:コスト自動調査の落とし穴と解消までの道のり
oasis1994liveforever
2
150
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
190
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
740
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
290
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Utilizing Notion as your number one productivity tool
mfonobong
4
620
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
290
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Transcript
Ruby内存管理理和垃圾回收机制
关于GC • GC是垃圾回收(Garbage Collection)的缩写 • GC帮助我们⾃自动释放内存(以及申请内存空间),省去 ⼿手动malloc()和free()内存的麻烦 (忘记申请内存,没有申请⾜足够的内存,忘记⼿手动释放内存 ,提前释放内 存
,重复释放内存)
GC的历史 • 1958年年John McCarthy创建了了 Lisp,这是第⼀一个使⽤用⾃自动垃 圾回收机制的编程语⾔言 • Mark & Sweep
算法依然被很 多GC系统使⽤用
Obj Obj Obj Ruby Heap Page Ruby如何使⽤用内存 Obj Obj Obj
Obj Obj Obj slot
Ruby如何使⽤用内存 • 初始化:申请多个 heap page(和操作系 统的heap⽆无关) • 每个heap page有408 个槽(slot),每个槽
占40字节 • 槽中⽤用于存放创建的对 象;如果超过40字 节,Ruby会额外申请 内存。 • 默认申请10000个槽 (RUBY_GC_HEAP_I NIT_SLOTS) Obj Ruby Heap Page slot Obj Obj Obj Obj Obj Obj Obj Obj
Ruby GC算法(2.1以前) Mark & Sweep
Mark & Sweep • 遍历所有的对象 • 标记不不需要回收的(即使⽤用中的)对象(Mark) • 清理理未被标记的对象即垃圾对象(Sweep)
Mark & Sweep • 优点:简单,容易易实现 • 缺点:Stop the world •
结果:应⽤用性能不不稳定
如何鉴别垃圾 对象 对象 引⽤用 垃圾对象
Ruby GC算法(2.1) Generational GC(分代GC)
分代GC • heap空间被分为两部分,Eden和Tomb • Eden存放新创建的对象 • Tomb存放空的heap page • 经历3次GC依然存活的对象称为old
object,其他的称为 young object
Obj Obj Obj Obj Obj Obj Eden Tomb 分代GC
Minor GC和Major GC • 两种GC:minor GC和major GC • minor GC:没有空余槽⽤用于存放对象时触发。特点:耗时
少,更更加频繁。作⽤用于“年年轻”的对象 • major GC触发条件:minor GC触发后还没有⾜足够空间; 或 当oldmalloc_increase_bytes,malloc_increase_bytes或 old_objects数量量超过限制(具体可以看GC.stat)。作⽤用于 “年年⻓长”的对象
Garbage Collector != Garbage Compactor 垃圾回收不不会压缩heap page空间
Ruby的内存占⽤用 • fragmentation(碎⽚片):只有当⼀一个heap page上的所有 slot都是空的才会被回收 • ⻓长运⾏行行的程序可能会有很多空余槽,⾮非空的heap page占⽤用 的内存不不会被释放 •
fork时这些碎⽚片也会被复制,加重了了内存占⽤用
解决⽅方案
GC tuning 参数 • RUBY_GC_HEAP_INIT_SLOTS • RUBY_GC_HEAP_FREE_SLOTS • RUBY_GC_HEAP_GROWTH_FACTOR •
RUBY_GC_HEAP_GROWTH_MAX_SLOTS • RUBY_GC_MALLOC_LIMIT RUBY_GC_MALLOC_LIMIT_MAX • RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR • RUBY_GC_OLDMALLOC_LIMIT • RUBY_GC_OLDMALLOC_LIMIT_MAX • RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR https://github.com/ruby/ruby/blob/ruby_2_6/gc.c#L7685
GC Compactor https://bugs.ruby-lang.org/issues/15626&sa=D&ust=1557178319914000
启示 • Ruby的内存管理理是⼀一个典型的⽤用空间换时间案例例 • GC tuning可能不不是⼀一个好的实践,同理理⼿手动调⽤用GC.start 可能也不不是⼀一个好主意 • 写代码时要尽量量避免创建多余的对象(frozen_string_literal) •
常量量,全局变量量引⽤用的对象不不会被GC
谢谢