你如何从壳牌强制垃圾收集?

所以我在远程盒子上查看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>