Java 当从Windows命令行运行时,如何请求JVM垃圾收集(而不是从代码)

Java 当从Windows命令行运行时,如何请求JVM垃圾收集(而不是从代码),java,windows,command-line,garbage-collection,Java,Windows,Command Line,Garbage Collection,如何从外部请求Java垃圾收集,从JAR启动程序(使用Windows BAT) 从Java代码中,我可以使用System.gc() 当运行JNLP发行版时,我从controlpanel/Java/打开了这个“Java控制台”。。。这个Java控制台提供手动垃圾收集 但是。。。当我从命令行/bat运行jar时,java控制台似乎没有打开。在谷歌上找不到帮助,可能是这里的某个人?您可以使用它连接到本地运行的JVM-这在GUI上提供了一个“执行GC”按钮 启动java进程时,您需要指定-Dcom.

如何从外部请求Java垃圾收集,从JAR启动程序(使用Windows BAT)

  • 从Java代码中,我可以使用
    System.gc()
  • 当运行JNLP发行版时,我从controlpanel/Java/打开了这个“Java控制台”。。。这个Java控制台提供手动垃圾收集
但是。。。当我从命令行/bat运行jar时,java控制台似乎没有打开。在谷歌上找不到帮助,可能是这里的某个人?

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


启动java进程时,您需要指定-Dcom.sun.management.jmxremote

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

您通常不应该有任何理由强制执行垃圾收集。这样做会弄乱垃圾收集器算法(主要是它们的性能)。当垃圾被收集时,它也会减慢程序的速度。如果存在内存问题,您应该使用内存跟踪工具找出引用的存放位置?(听众是否未注册?)


与其他答案一样,您可以使用jconsole或jvisualvm。您还可以使用jmx以编程的方式来完成它。

对于纯命令行方法,您应该能够使用。我相信jcmd至少从Java1.7开始就是标准JDK安装的一部分。该命令如下所示:

jcmd <process-id> GC.run
jcmd <process-id> help
jcmd GC.run
您可以获得jcmd为以下特定流程提供的可用诊断命令列表:

jcmd <process-id> GC.run
jcmd <process-id> help
jcmd帮助

强制GC收集有许多合法用途。一个是用于测试目的。另一个例子:如果您在使用SSD交换的低内存系统中开发。Java不知道内存是“快速内存”还是交换。所以Java倾向于在自动启动GC之前使用所有可用内存。在这种情况下,手动FireGC会有很大帮助。显然,在服务器生产使用的任何情况下都不建议使用它(至少我现在不能想象一个)。看起来很简单,链接的顶部答案也是这里的顶部答案。