Search code examples
javagarbage-collectionjmxjmap

How do you Force Garbage Collection from the Shell?


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?


Solution

  • 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