Bug #19907
closedMethod calls with keyword arguments in eval leaks callcache and callinfo objects
Description
The following script leaks callcache and callinfo objects:
def foo(a:); end
10.times do
10_000.times do
eval(<<~RUBY)
foo(a: 1)
RUBY
end
puts "Number of live objects: #{GC.stat(:heap_live_slots)}"
puts "Memory usage: #{`ps -o rss= -p #{$$}`}"
puts
end
Output is:
Number of live objects: 46248
Memory usage: 16160
Number of live objects: 65902
Memory usage: 19888
Number of live objects: 92656
Memory usage: 24032
Number of live objects: 126791
Memory usage: 28048
Number of live objects: 132919
Memory usage: 28816
Number of live objects: 180687
Memory usage: 32384
Number of live objects: 181957
Memory usage: 32464
Number of live objects: 227485
Memory usage: 34224
Number of live objects: 256101
Memory usage: 37200
Number of live objects: 274151
Memory usage: 38752
After performing a ObjectSpace.dump_all
, I found that it is leaking callcache and callinfo objects that is being held on by the Object
class.
{"address":"0x102ecef70", "type":"CLASS", "shape_id":2, "slot_size":160, "class":"0x102ecf8d0", "variation_count":0, "superclass":"0x102ecfd30", "real_class_name":"Object", "singleton":true, "references":[ ... ]}
{"address":"0x1030c90a0", "type":"IMEMO", "shape_id":0, "slot_size":40, "imemo_type":"callinfo", "mid":"foo", "memsize":40, "flags":{"wb_protected":true}}
{"address":"0x102fad568", "type":"IMEMO", "shape_id":0, "slot_size":40, "imemo_type":"callcache", "memsize":40, "flags":{"wb_protected":true, "old":true, "uncollectible":true, "marked":true}}
Updated by jeremyevans0 (Jeremy Evans) about 1 year ago
- Related to Bug #18553: Memory leak on compiling method call with kwargs added
Updated by jhawthorn (John Hawthorn) 8 months ago
- Related to Bug #19970: Eval leaks callcache and callinfo objects on arm32 (linux) added
Updated by jhawthorn (John Hawthorn) 8 months ago
https://github.com/ruby/ruby/pull/9973
I've opened a PR to de-dup identical callinfo, which will also in this case avoid the allocation of unnecessary callcache.
Running the script above:
Number of live objects: 9139
Memory usage: 19620
Number of live objects: 13132
Memory usage: 19620
Number of live objects: 12728
Memory usage: 19620
Number of live objects: 13451
Memory usage: 19620
Number of live objects: 10028
Memory usage: 19620
Number of live objects: 13150
Memory usage: 19620
Number of live objects: 12210
Memory usage: 19620
Number of live objects: 12538
Memory usage: 19620
Number of live objects: 9023
Memory usage: 19620
Number of live objects: 11948
Memory usage: 19620
Updated by byroot (Jean Boussier) 7 months ago
- Related to Bug #20348: Memory leak with method kwargs in ERB template added
Updated by byroot (Jean Boussier) 7 months ago
- Backport changed from 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN to 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED
Updated by byroot (Jean Boussier) 7 months ago
- Status changed from Open to Closed
Fixed by 1c97abaabae6844c861705fd07f532292dcffa74
and 081ee3d35509110f383cb7dd8d1205def0cdd1e8
Updated by naruse (Yui NARUSE) 7 months ago
- Backport changed from 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED to 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE
ruby_3_3 57a0afe2090b8d05673d650b1e8bf9ae67449b1f merged revision(s) 081ee3d35509110f383cb7dd8d1205def0cdd1e8,1c97abaabae6844c861705fd07f532292dcffa74.
Updated by nagachika (Tomoyuki Chikanaga) 3 months ago
- Backport changed from 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE to 3.0: WONTFIX, 3.1: WONTFIX, 3.2: WONTFIX, 3.3: DONE
Backporting 1c97abaabae6844c861705fd07f532292dcffa74 into ruby_3_2 branch introduces MJIT test failures (TestMJIT#test_compile_insn_invokesuper).
https://github.com/nagachika/ruby/actions/runs/9825009796/job/27124625737
I gave up to fix this issue on ruby_3_2.