Project

General

Profile

Bug #20485

Updated by skhrshin (Shintaro Sakahara) 2 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 { 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. same.

Back