Answers:
像这样启动它:
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 / 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
Explicit GC is disabled, no GC has been performed
,可能是由于-XX:+DisableExplicitGC
VM参数引起的。请参阅:mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/...
如果运行jmap -histo:live <pid>
,这将在堆中打印出所有内容之前在堆上强制使用完整的GC。
jcmd
现在是完成工作的正确工具。
除了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
...
这可以借助这个stackoverflow答案来解决
sudo -u <process_owner> jcmd <pid> GC.run
<process_owner>
使用PID运行过程的用户在哪里<pid>
?您可以从top
或htop
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
,您可以尝试吗?该命令应该是安全的
还有其他一些解决方案(这里已经有很多好的解决方案):
gc()
。gc()
在MemoryMBean上运行操作以下示例适用于cmdline-jmxclient:
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc
很好,因为它只有一行,您可以非常轻松地将其放入脚本中。
只是:
kill -SIGQUIT <PID>