Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Confusing array garbage collection, how to get valid heap snapshot?
Greg Fodor
5/23/2007 12:58:00 AM
We are working on tracking down a memory leak, and are hoping to use
heap snapshotting to find the culprit. Using the neat bleak_house
library:
http://blog.evanweaver.com/articles/2007/04/28/b...
I have got snapshotting working on my local machine. Note this library
does not go through ObjectSpaces, but uses a custom ruby build, so its
much more accurate in showing the true state of the heap. However,
there seems to be a bit of a problem, this simple script I wrote for
testing purposes:
# Snapshot here
a = Array.new(1000) { Object.new }
a = nil
1.upto(20) { GC.start; ObjectSpace.garbage_collect; sleep 1; }
# Snapshot here
Shows that the 1000 objects in the array are still on the heap in the
second snapshot. Now, I realize GC.start makes no guarantees about
actually removing the objects marked, but it seems that in this case
they should go away since I am calling it so aggressively over such a
long period. What is really strange however is that if I all a.clear
before setting a to nil, the objects *do* go away upon the first
GC.start. So, either there is something still holding those references
in the above case, or the GC is extraordinarily conservative in
relation to GC.start.
I've also tried wrapping this code up into a class, putting the array
into an instance variable, and I get the same behavior. (This was to
make sure there are no procs or something at the root scope holding
these guys.)
In order to effectively track down memory leaks, there needs to be the
concept of a totally GC'ed heap snapshot. It appears based upon the
above behavior this is difficult to get. If the above code was under
test my heap snapshot would show a 'leak' of 1000 objects even though
my code was correctly dereferencing them. Is there something I am
missing here?
1 Answer
Joel VanderWerf
5/23/2007 1:57:00 AM
0
Greg Fodor wrote:
> We are working on tracking down a memory leak, and are hoping to use
> heap snapshotting to find the culprit. Using the neat bleak_house
> library:
>
>
http://blog.evanweaver.com/articles/2007/04/28/b...
>
> I have got snapshotting working on my local machine. Note this library
> does not go through ObjectSpaces, but uses a custom ruby build, so its
> much more accurate in showing the true state of the heap. However,
> there seems to be a bit of a problem, this simple script I wrote for
> testing purposes:
>
> # Snapshot here
> a = Array.new(1000) { Object.new }
> a = nil
> 1.upto(20) { GC.start; ObjectSpace.garbage_collect; sleep 1; }
> # Snapshot here
This is probably not very helpful, because I don't know what bleak_house
is but:
- calling GC repeatedly is unlikely to make a difference
- GC is conservative in treating stack data as potential pointers
- you can see the effect in the following example:
GC.start
n0 = ObjectSpace.each_object(Object){}
def foo
a = Array.new(1000) { Object.new }
a = nil
a = Array.new(1000) { Object.new }
a = nil
a = Array.new(1000) { Object.new }
a = nil
end
foo
GC.start
n1 = ObjectSpace.each_object(Object){}
p n1 - n0
__END__
This outputs 998 for me. If you only create one array inside of #foo,
the output is the same, probably since the stack space was reused.
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Confusing array garbage collection, how to get valid heap snapshot?
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password