views:

68

answers:

5

So I am looking at a heap with jmap on a remote box and I want to force garbage collection on it. How do you do this without popping into jvisualvm or jconsole and friends?

I know you shouldn't be in the practice of forcing garbage collection -- you should just figure out why the heap is big/growing.

I also realize the System.GC() doesn't actually force garbage collection -- it just tells the GC that you'd like it to occur.

Having said that is there a way to do this easily? Some command line app I'm missing?

A: 

I don't think there is any command line option for same.

You will need to use jvisualvm/jconsole for same.

I would rather suggest you to use these tools to identity , why your program is high on memory.

Anyways you shouldn't force GC, as it would certainly disturb GC algorithm and make your program slow.

YoK
A: 

To my knowledge, there is no way to force it in the standard JVM contract. The GC is part of the JVM implementation. What is the application? What is it running on?

However calling System.gc() has always worked nicely when I had to call it. If the heap use does not lower, it may mean that all objects on the stack are indeed referenced somewhere.

BenoitParis
+2  A: 

You can do this via the free jmxterm program.

Fire it up like so:

java -jar jmxterm-1.0-alpha-4-uber.jar

From there, you can connect to a host and trigger GC:

$>open host:jmxport
#Connection to host:jmxport is opened
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>run gc
#calling operation gc of mbean java.lang:type=Memory
#operation returns: 
null
$>quit
#bye

Look at the docs on the jmxterm web site for information about embedding this in bash/perl/ruby/other scripts. I've used popen2 in Python or open3 in Perl to do this.

UPDATE: here's a one-liner using jmxterm:

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port
Harold L
+1  A: 

There's a few solutions:

The following example is for the cmdline-jmxclient:

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc

This is nice because it's only one line and you can put it in a script really easily.

The Alchemist
A: 

If you run jmap -histo:live, that will force a full GC on the heap before it prints anything out.

Will Hartung