问题
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?
回答1:
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
回答2:
Since JDK 7 you can use the JDK command tool 'jcmd' such as:
jcmd <pid> GC.run
回答3:
If you run jmap -histo:live <pid>
, that will force a full GC on the heap before it prints anything out.
回答4:
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
回答5:
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.
回答6:
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.
回答7:
If you are using jolokia with your application, you can trigger a garbage collection with this command:
curl http://localhost:8558/jolokia/exec/java.lang:type=Memory/gc
回答8:
for linux:
$ jcmd $(pgrep java) GC.run
jcmd
is packaged with the JDK, $(pgrep java)
gets the process ID of java
回答9:
just:
kill -SIGQUIT <PID>
来源:https://stackoverflow.com/questions/3523837/how-do-you-force-garbage-collection-from-the-shell