2010-08-19 48 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