How to understand why object is not collected?

Hi all.

Here’s a problem.

I have some object of MyClass with complex “freeing” logic, and I want
to
test this logic.
I do:


span = … #somehow created object

ObjectSpace.define_finalizer(span, proc{p “gc ok”}) #define test
finalizer

span.detach #remove object from all of my internal caches, no
references
to object should exist

span = nil #remove the last reference to object

GC.start #<===HERE the object must be collected and finalized

p “end of code”

I expect:

“gc ok”
“end of code”

I receive:

“end of code”
“gc ok”

OK, I suppose there are some references to the object still exists. I
want
to know, at least, what number of references still exists (in ideal, I’d
want to know, where they are).
How I can? (except of harcode hacking GC’s C code)

Ruby 1.9 (downloaded a week ago), Windows.

Thanks.

V.

Victor “Zverok” Shepelev wrote:

ObjectSpace.define_finalizer(span, proc{p “gc ok”}) #define test finalizer

span.detach #remove object from all of my internal caches, no references
to object should exist

span = nil #remove the last reference to object

GC.start #<===HERE the object must be collected and finalized

This is probably a situation where GC is being conservative. A simple
example:

class Foo; end

foo = Foo.new
foo = nil

GC.start

p ObjectSpace.each_object(Foo) {} # ==> 1

Probably this means that the Foo instance pointer is still visible
somewhere in the local frame.

But that doesn’t mean that there is a leak:

class Foo; end

10.times do
Foo.new
end

GC.start

p ObjectSpace.each_object(Foo) {} # ==> 1

In my experience, it’s hard to write precise unit tests for GC behavior,
and you end up with some fuzziness. The important property of GC is
really the asymptotic behavior.

On 2006.10.29 03:26, Victor Zverok S. wrote:

Hi all.

Here’s a problem.

I have some object of MyClass with complex “freeing” logic, and I want to
test this logic.

Hard to say what is going wrong but the solution is simple. Whenever
you have a resource that must be released, do it explicitly. The way
this is usually implemented is either:

f = File.open ‘foo’
puts f.read
f.close

Or, more conveniently

File.open(‘foo’) {|f| puts f.read}

The block-form uses ensure to make sure the file handle gets closed.

From: Joel VanderWerf [mailto:[email protected]]
Sent: Saturday, October 28, 2006 10:52 PM

p ObjectSpace.each_object(Foo) {} # ==> 1
OK, I’ve got it.

In my experience, it’s hard to write precise unit tests for GC behavior,
and you end up with some fuzziness. The important property of GC is
really the asymptotic behavior.

Just for now, I need no precise unit test. I just want to know, would
the
objects of MyClass collected in principle. Can I achieve the goal
somehow?

V.

Victor “Zverok” Shepelev wrote:

GC.start
objects of MyClass collected in principle. Can I achieve the goal somehow?
What about creating a lot of them in a loop, without keeping references?
Then I would expect GC to leave at most one instance.

From: Eero S. [mailto:[email protected]]
Sent: Saturday, October 28, 2006 11:20 PM

you have a resource that must be released, do it explicitly. The way
The block-form uses ensure to make sure the file handle gets closed.
I know this (I was C++ guy foe many years, so RAII is my breath), but
can’t
use.
My objects are HTML DOM elements and I want to be sure they are GC’d
when
detached from DOM and have no other references.

V.

From: Joel VanderWerf [mailto:[email protected]]
Sent: Saturday, October 28, 2006 11:26 PM

Just for now, I need no precise unit test. I just want to know, would the
objects of MyClass collected in principle. Can I achieve the goal
somehow?

What about creating a lot of them in a loop, without keeping references?
Then I would expect GC to leave at most one instance.

They can’t be created by .new, they created in correspondence to some
HTML
DOM by C extension.
Problem already solved by the trick:


def test
span = …
ObjectSpace.define_finalizer(span, proc{p “gc ok”})
span.detach
span = nil
end

test

GC.start

p “end of code”

Output corresponds to my expectations (gc ok => end of code)

Thanks for your help!

V.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs