2010-08-19 31 views
68

所以我在遠程盒子上看着jmap堆,我想強制垃圾收集。你如何做到這一點沒有彈出jvisualvm或jconsole和朋友?如何從殼牌強制垃圾收集?

我知道你不應該強迫垃圾收集的做法 - 你應該找出爲什麼堆是大/增長。

我也意識到System.GC()實際上並沒有強制垃圾收集 - 它只是告訴GC你希望它發生。

說了這麼簡單嗎?我錯過了一些命令行應用程序?

+0

*不*相同現在http://stackoverflow.com/questions/1481178/how-to-force-garbage-collection-in-java – Raedwald 2016-03-31 16:02:37

回答

20

你可以通過免費的jmxterm程序來做到這一點。

火起來就像這樣:

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

從那裏,你可以連接到主機和觸發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 

只看該jmxterm網站上的文檔有關的信息嵌入這在bash/perl/ruby​​ /其他腳本中。我在Python中使用popen2或在Perl中使用open3來執行此操作。

UPDATE:這裏是一個班輪使用jmxterm:

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port 
0

我不認爲有相同的命令行選項。

您將需要使用jvisualvm/jconsole。

我寧願建議你使用這些工具來識別,爲什麼你的程序是高內存。

反正你不應該強制GC,因爲它肯定會干擾GC算法,並使你的程序變慢。

6

還有一些其他的解決方案(大量的優秀人才在這裏的話):

下面的例子是用於CMDLINE-jmxclient運行gc()操作:

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

這是很好因爲它只有一行,你可以很容易地將它放在腳本中。

88

如果您運行的是jmap -histo:live,那麼在打印任何內容之前,這將在堆上強制執行完整的GC。

+5

*這是*什麼我'我在說話! – sourcedelica 2013-03-19 22:20:33

+2

強制在所有javas上進行垃圾回收: ps axf | grep java | grep -v grep | awk'{print「jmap -histo:live」$ 1}'| sh – gtrak 2013-11-19 23:18:24

+0

記錄在哪裏?如果沒有:現場(例如,當需要-F時)? – nafg 2014-08-29 09:25:49

-6

剛:

kill -SIGQUIT <PID> 
+4

這會觸發堆轉儲而不是垃圾收集 – 2013-05-01 20:18:19

+0

至少是solaris它會強制GC。 – 2014-02-04 23:27:12

+2

即使在Solaris中,SIGQUIT也不會觸發GC或堆轉儲。 SIGQUIT將僅針對HotSpot觸發線程轉儲。對於IBM JVM,它是可配置的。 – 2015-08-28 19:15:32

221

因爲JDK 7,你可以使用JDK的命令工具 'jcmd',如:

jcmd <pid> GC.run

+13

你爲什麼不告訴我這些事情? :) – noahlz 2014-09-16 14:11:43

+2

正是我在找,謝謝。 – 2014-10-15 13:25:50

+8

這不是被接受的答案嗎? – brunorey 2016-08-19 15:24:52

0

如果使用jolokia與您的應用程序,你可以觸發使用此命令的垃圾回收:

curl http://localhost:8558/jolokia/exec/java.lang:type=Memory/gc 
0

user3198490的答案。運行此命令可能給你以下錯誤消息:

$ 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 stackoverflow answer

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

其中<process_owner>的幫助來解決是運行與PID <pid>進程的用戶。你可以得到從tophtop