[ruby-core:66961] [ruby-trunk - Bug #10620] #define_singleton_method keeps object from being garbage collected

From: normalperson@...
Date: 2014-12-19 01:18:37 UTC
List: ruby-core #66961
Issue #10620 has been updated by Eric Wong.


 Try the following infinite loop, I see stable memory usage:
 
 	loop do
 	  obj = Object.new
 	  obj.define_singleton_method(:f) { "F" }
 	end
 
 Not even multiple calls to GC.start can guarantee an object is
 collected, as the current Ruby GC is conservative and not precise.
 Precise GC should solve the problem, but that is a lot of work
 (and we'd still need a conservative part for 3rd party extensions
 for years)

----------------------------------------
Bug #10620: #define_singleton_method keeps object from being garbage collected
https://bugs.ruby-lang.org/issues/10620#change-50498

* Author: Sean Dilda
* Status: Open
* Priority: Normal
* Assignee: 
* Category: core
* Target version: 
* ruby -v: 2.1.5
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
After using #define_singleton_method on an object, the object is never garbage collected

Sample code:
#!/usr/bin/env ruby

obj = Object.new
obj_id = obj.object_id
obj = nil

GC.start
GC.start
GC.start
GC.start
begin
  ObjectSpace._id2ref obj_id
  puts "GC failed, object still exists"
rescue RangeError
  puts "GC worked"
end


obj = Object.new
obj.define_singleton_method(:f) { "F" }
obj_id = obj.object_id
obj = nil

GC.start
GC.start
GC.start
GC.start
begin
  ObjectSpace._id2ref obj_id
  puts "GC failed, object still exists"
rescue RangeError
  puts "GC worked"
end


This outputted:
GC worked
GC failed, object still exists


The object without the singleton method was cleaned up properly, the object with defined_singleton_method used never got cleaned up.



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next