如何在Windows命令行中运行时请求JVM垃圾回收(不通过代码)

15

我如何在外部请求Java垃圾回收,使用JAR启动程序(使用Windows BAT)?

  • 从Java代码中,我可以通过 System.gc() 实现。
  • 当运行JNLP分发时,在控制面板/ Java / ... 中打开“Java控制台”,该Java控制台提供手动垃圾回收。

但是... 当我从命令行/bat运行jar文件时,似乎没有打开Java控制台。在快速搜索中找不到帮助,请问这里有人能提供帮助吗?


看起来是 https://dev59.com/eHA75IYBdhLWcg3wAEDx 的重复,该链接的顶部答案也在那里成为了顶部答案。 - Alex Martian
4个回答

16

如果您希望纯命令行方式操作,您应该可以使用 jcmd。我相信自Java 1.7起,jcmd已成为标准JDK安装的一部分。命令类似于这样:

jcmd <process-id> GC.run
您可以通过以下方式获取jcmd为特定进程提供的可用诊断命令列表:
jcmd <process-id> help

11

你可以使用jconsole连接到本地运行的JVM-这在GUI上提供了一个“执行GC”按钮。

当你启动Java进程时,需要指定-Dcom.sun.management.jmxremote


5

如果您使用最新的Java 6,您还可以使用jvisualvm来补充和扩展jconsole的功能。它们都是非常有用的工具。


1

通常情况下,您不应该有任何理由强制执行垃圾回收。这样做会破坏垃圾回收器算法(主要是它们的性能)。在垃圾被收集时,它也会减慢程序的运行速度。如果存在内存问题,您应该使用内存跟踪工具查找引用所在的位置?(是否已注销监听器?)

与其他答案一样,您可以使用jconsole或jvisualvm。您还可以使用JMX以编程方式执行此操作。


强制进行GC收集有许多合法的用途。其中一个是为了测试目的。另一个例子:如果您在低内存系统上使用SSD交换,Java不知道这个内存是“快速内存”还是交换内存。因此,Java倾向于在自动触发GC之前使用所有可用的空闲内存。在这种情况下手动触发GC可以帮助很多。显然,在任何服务器生产用途中都不建议这样做(至少我现在无法想象这样的情况)。 - Felipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接