Re: Forcing garbage collection
On Mon, 30 Nov 2009, Dan wrote:
Is there a way to force garbage collection in Java?
Before anyone answers I feel I need to state:
- I know about System.gc() and Runtime.gc() and what they do
- I am not suggesting to do this in production code
The purpose of my asking is that I want to test a finializer during a
unit test by allowing something to go out of scope naturally. The
reason why I need it to fall out of scope instead of calling the
finalizer directly is because I am testing that no other references
exist and that the act of letting it fall out of scope makes it
eligible for gc.
First up, rather than using a finalizer, i'd use a PhantomReference:
http://java.sun.com/javase/6/docs/api/java/lang/ref/PhantomReference.html
I don't think much is guaranteed for either approach, but i believe a
PhantomReference is likely to tell you about collection sooner than a
finalizer would. It's definitely a lot classier.
So in this specific case, how would I do it? I know that code profiling
tools such as jProfiler can somehow force gc on a remote JVM. Does
anyone know how this works?
I suspect they do it via JMX - JConsole can do it, and that's a JMX tool.
There's an MBean for the GC:
http://java.sun.com/javase/6/docs/api/java/lang/management/GarbageCollectorMXBean.html
But it doesn't have a method to force collection. There's an extension for
Sun's implementations:
http://java.sun.com/javase/6/docs/jre/api/management/extension/com/sun/management/GarbageCollectorMXBean.html
But that doesn't have such a method either. But i bet if you dig into this
you'll find a way to do it. Some super sekrit method somewhere.
tom
--
packaheomg sogma's