Actions
Bug #19906
closedfix kwarg memory leak
Description
GitHub PR: https://github.com/ruby/ruby/pull/8556
ci info tracks kwargs and which are shared across aliases
30.times do
100_000.times do
def foo(k:); yield; end
alias bar foo
undef foo
end
puts `ps -o rss= -p #{$$}`
end
before:
30364
45120
59700
73932
88512
102680
116884
130884
145308
159688
174468
188680
203016
216908
231568
246096
260592
274900
289168
303420
317620
331956
346148
360708
374880
389172
403472
417824
432016
446040
460196
474604
489152
503248
517504
531944
546228
560520
574760
589108
after:
8760
8940
9156
9540
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9548
9556
9564
9564
9564
9564
9564
9564
9564
9564
9564
9564
9564
9564
9576
9744
9744
9744
9744
9744
9936
Updated by nobu (Nobuyoshi Nakada) about 1 year ago
I can't reproduce it on {arm64,x86_64}-{darwin,linux}.
Updated by HParker (Adam Hess) about 1 year ago
- Status changed from Open to Closed
Applied in changeset git|c74dc8b4af4ef1b32f65587f083fbeba4ca186fa.
Use reference counting to avoid memory leak in kwargs
Tracks other callinfo that references the same kwargs and frees them when all references are cleared.
[bug #19906]
Co-authored-by: Peter Zhu peter@peterzhu.ca
Updated by HParker (Adam Hess) about 1 year ago
Updated reproduction script:
Maybe this is a better reproduction?
a = RubyVM::InstructionSequence.compile("foo(bar: :baz)").to_binary
10.times do
500_000.times do
RubyVM::InstructionSequence.load_from_binary(a)
end
puts `ps -o rss= -p #{$$}`
end
before:
20244
31760
40572
48468
55324
63712
71260
79552
87224
94492
after:
13156
16072
16080
16620
16620
16620
16628
16672
16672
16672
Updated by peterzhu2118 (Peter Zhu) about 1 year ago
- Related to Bug #18553: Memory leak on compiling method call with kwargs added
Actions
Like0
Like0Like0Like0Like0