Issue #19907 has been updated by naruse (Yui NARUSE).
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.
----------------------------------------
Bug #19907: Method calls with keyword arguments in eval leaks callcache and callinfo
objects
https://bugs.ruby-lang.org/issues/19907#change-107403
* Author: peterzhu2118 (Peter Zhu)
* Status: Closed
* Backport: 3.0: WONTFIX, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE
----------------------------------------
The following script leaks callcache and callinfo objects:
```ruby
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.
```json
{"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}}
```
--
https://bugs.ruby-lang.org/