Actions
Bug #20485
closedSimple use of Fiber makes GC leak objects with singleton method
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.4 (2024-04-23 revision af471c0e01) [x86_64-linux]
Description
I found a possible memory leak which occurs only when several conditions are met.
The code to reproduce the problem is below:
class Work
def add_method
singleton_class.define_method(:f) {}
end
end
1.times { Fiber.new {}.resume }
work = Work.new
work.add_method
work = nil
GC.start
num_objs = ObjectSpace.each_object.select { |o| o.is_a?(Work) rescue false }.size
unless num_objs.zero?
raise "NG"
end
Expected result: The script exits normally.
Actual result: RuntimeError "NG" is raised.
If I change 1.times { Fiber.new {}.resume }
to just Fiber.new {}.resume
or remove work.add_method
, GC works as expected.
Is there any problem at the way to use Fiber in this code, or is it a bug due to Ruby?
I tested ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux] too and the result was a little different. The code above didn't reproduce the problem, but if I changed 1.times
to Mutex.new.synchronize
, it was able to reproduce.
Actions
Like0
Like0Like0Like0Like0Like0Like1Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0