From: Eric Hodel Date: 2006-11-06T07:44:27+09:00 Subject: Re: Garbage collection/memory unfreed problem On Nov 2, 2006, at 9:55 PM, Mark Noworolski wrote: > It appears that the ruby garbage collector is not freeing up unused > memory on my linux machine, but IS on my windows machine... I'm > baffled > and troubled. Any advice would be appreciated... > > Using the attached test script, in linux I observe the VMRSS start at > around 1.5Meg, then go up to ~20Meg by iteration 3 or 4, and sit there > for the remaining iterations. Then once the t array goes out of > scope, I > see it drop by a few meg. The GC.start only drops apparent memory > consumption to ~14Meg. > > Meanwhile, on windows XP, I see it increase to around 20Meg, then sit > around there until the GC.free, which brings it back down to around > 5Meg, close to the starting point. > > Can anybody explain the difference here? Is the 14meg _really_ > unavailable to the OS in linux? Ruby's garbage collector is conservative and walks the stack looking for pointers into the heap. If it finds a possible pointer to the heap the referenced memory will not be reclaimed. This can happen even if you've returned from a method that referenced a large object. > ------------- > class Grab > def initialize > @myhash={} > 0.upto(100000) {|i| @myhash[i]="#{i} Im a part of a hash"} > end > end > > def memuse > #IO.read("/proc/#{Process.pid}/status") =~ /VmSize.* (\d+) k/ > "Hi" > end > > puts "Mem before anything: #{memuse}" > sleep 10; > 0.upto(10) do |x| > t||=Array.new > t[x]=Grab.new > puts "Mem in scope #{x}: #{memuse}" > sleep 1; > end > puts "mem out of scope #{memuse}" > sleep 10; > GC.start > puts "Mem after GC: #{memuse}" > sleep 10; -- Eric Hodel - drbrain@segment7.net - http://blog.segment7.net This implementation is HODEL-HASH-9600 compliant http://trackmap.robotcoop.com