How do you Force Garbage Collection from the Shell?

前端 未结 9 644
滥情空心
滥情空心 2020-11-30 17:42

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?<

相关标签:
9条回答
  • There's a few other solutions (lots of good ones here already):

    • Write a little code to access the MemoryMBean and call gc().
    • Using a command-line JMX client (like cmdline-jmxclient, jxmterm) and run the gc() operation on the MemoryMBean

    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.

    0 讨论(0)
  • 2020-11-30 17:49

    for linux:

    $ jcmd $(pgrep java) GC.run
    

    jcmd is packaged with the JDK, $(pgrep java) gets the process ID of java

    0 讨论(0)
  • 2020-11-30 17:55

    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.

    0 讨论(0)
  • 2020-11-30 17:57

    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
    
    0 讨论(0)
  • 2020-11-30 17:57

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

    0 讨论(0)
  • 2020-11-30 17:58

    Since JDK 7 you can use the JDK command tool 'jcmd' such as:

    jcmd <pid> GC.run

    0 讨论(0)
提交回复
热议问题