Project

General

Profile

Actions

Bug #19907

open

Method calls with keyword arguments in eval leaks callcache and callinfo objects

Added by peterzhu2118 (Peter Zhu) 5 months ago. Updated 14 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:114932]

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}}

Related issues 2 (1 open1 closed)

Related to Ruby master - Bug #18553: Memory leak on compiling method call with kwargsClosedko1 (Koichi Sasada)Actions
Related to Ruby master - Bug #19970: Eval leaks callcache and callinfo objects on arm32 (linux)OpenActions
Actions #1

Updated by jeremyevans0 (Jeremy Evans) 5 months ago

  • Related to Bug #18553: Memory leak on compiling method call with kwargs added
Actions #2

Updated by jhawthorn (John Hawthorn) 18 days ago

  • Related to Bug #19970: Eval leaks callcache and callinfo objects on arm32 (linux) added

Updated by jhawthorn (John Hawthorn) 14 days 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
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0