How do you Force Garbage Collection from the Shell

2019-01-16 02:06发布

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?

8条回答
女痞
2楼-- · 2019-01-16 02:18

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

查看更多
爷、活的狠高调
3楼-- · 2019-01-16 02:26

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
查看更多
仙女界的扛把子
4楼-- · 2019-01-16 02:27

Addition to user3198490's answer. Running this command might give you the following error message:

$ jcmd 1805 GC.run    
[16:08:01]
1805:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
...

This can be solved with help of this stackoverflow answer

sudo -u <process_owner> jcmd <pid> GC.run

where <process_owner> is the user that runs the process with PID <pid>. You can get both from top or htop

查看更多
Juvenile、少年°
5楼-- · 2019-01-16 02:31

There's a few other solutions (lots of good ones here already):

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.

查看更多
虎瘦雄心在
6楼-- · 2019-01-16 02:35

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

jcmd <pid> GC.run

查看更多
看我几分像从前
7楼-- · 2019-01-16 02:35

just:

kill -SIGQUIT <PID>
查看更多
登录 后发表回答