您如何从外壳强制垃圾收集?

问题描述 投票:95回答:9

因此,我正在远程容器上查看带有jmap的堆,我想对其进行强制垃圾收集。如何在不弹出jvisualvm或jconsole和朋友的情况下执行此操作?

我知道您不应该进行强制垃圾回收的实践,您应该弄清楚为什么堆这么大/越来越大。

[我也意识到System.GC()实际上并没有强制垃圾回收-它只是告诉GC您希望它发生。

说过,有没有一种方法可以轻松地做到这一点?我缺少一些命令行应用程序?

java garbage-collection jmx jmap
9个回答
22
投票

您可以通过免费的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​​ / other脚本的信息。我已经在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

310
投票

自JDK 7起,您可以使用JDK命令工具'jcmd',例如:

jcmd <pid> GC.run


100
投票

如果运行jmap -histo:live <pid>,将在打印任何内容之前在堆上强制使用完整的GC。


13
投票

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]中获取两者>


6
投票

还有一些其他解决方案(这里已经有很多好的解决方案:]


0
投票

我认为没有相同的命令行选项。


0
投票

如果您在应用程序中使用jolokia,则可以使用以下命令触发垃圾回收:


0
投票

对于Linux:


-9
投票

只是:

© www.soinside.com 2019 - 2024. All rights reserved.