Bug #20485
Updated by skhrshin (Shintaro Sakahara) 6 months ago
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 Mutex.new.synchronize { 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 remove `Mutex.new.synchronize { Fiber.new {}.resume }` to `Fiber.new {}.resume` or remove `work.add_method`, GC works as expected. Is there any problem at the way to use Mutex and 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 same.