Project

General

Profile

Bug #10191

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

Steps: 

 1. 
 (1) Run the following code (tested on Window 7): 

   ~~~ruby 
   class Leaky 
     attr_accessor :v 
     def leak; d = dup; d.v = nil; end 
   end 

   l = Leaky.new 
   while true; l.leak; end 
   ~~~ 

 2. (2) Watch the memory usage in Task Manager or equivalent 
   


 Expected result: 
   
 Infinite loop, memory usage fairly stable (as GC cleans up) 

   

 Actual result: 
   
 Interpreter consumes more and more memory, and eventually throws the following exception: "in `dup': failed to allocate memory (NoMemoryError)."    Presumably, this is a memory leak.   

     

 Workaround: 
   
 If you manually set the instance variable before dup-ing, memory usage is stable.    Accordingly, this code does not appear to leak memory: 

   ~~~ruby 
   class NonLeaky 
     attr_accessor :v 
     def leak; @v ||= nil; d = dup; d.v = nil; end 
   end 

   l = NonLeaky.new 
   while true; l.leak; end 
   ~~~ 

Back