你如何从壳牌强制垃圾收集?
所以我在远程盒子上查看jmap的堆,我想强制垃圾收集。 你如何做到这一点没有popupjvisualvm或jconsole和朋友?
我知道你不应该强迫垃圾收集的做法 – 你应该弄清楚为什么堆大/成长。
我也意识到System.GC()实际上并没有强制垃圾回收 – 它只是告诉GC你希望它发生。
说了这么简单吗? 我错过了一些命令行应用程序?
你可以通过免费的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网站上的文档,获取有关将其embedded到bash / perl / ruby / other脚本中的信息。 我用Python中的popen2或者Perl中的open3来做到这一点。
更新:这是一个使用jmxterm的单线程:
echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port
由于JDK 7可以使用JDK命令工具“jcmd”,例如:
jcmd <pid> GC.run
如果你运行jmap -histo:live
,那么在打印任何东西之前,这将会在堆上强制执行完整的GC。
还有其他一些解决scheme(已经有很多很好的解决scheme):
- 写一点代码来访问MemoryMBean并调用
gc()
。 - 使用命令行JMX客户端(如cmdline-jmxclient , jxmterm )并对MemoryMBean运行
gc()
操作
以下示例适用于cmdline-jmxclient:
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc
这很好,因为它只有一行,你可以很容易地把它放在一个脚本。
我不认为有相同的命令行选项。
您将需要使用jvisualvm / jconsole相同。
我宁愿build议你使用这些工具来识别,为什么你的程序是高内存。
无论如何,你不应该强迫GC,因为它肯定会干扰GCalgorithm,并使你的程序变慢。
只是:
kill -SIGQUIT <PID>