2013-01-23 39 views
0

我可以强制运行Java应用程序从垃圾收集从控制台?我可以强制运行Java应用程序从控制台垃圾收集

只是为了抢占一些回复:

  • 我知道我可以JVisualVM做,但我只有控制台访问不 X-Windows访问
  • 我知道的System.gc()只要求垃圾收集它并没有强制 它,但那似乎3.工作,所以我寻找一种方式呼吁 externaly。
  • 我知道你不应该垃圾收集工作应用程序,我做 这是检查潜在内存泄漏的过程的一部分。
  • 应用在生产中runinng我不能修改其 管环境,JVM ecetera
+0

你有没有看到这个? http://stackoverflow.com/questions/1481178/forcing-garbage-collection-in-java –

+0

要检查潜在的内存泄漏,您还必须查看收集后使用了多少内存。对于这个VisualVM是最简单的,所以使用它。 –

+1

[Duplicate](http://stackoverflow.com/questions/3523837/how-do-you-force-garbage-collection-from-the-shell)详细介绍了如何做到这一点。 –

回答

2

JVisualVM可以连接到远程进程,如果

  • 相关的端口是开放的
  • java程序启动时使用正确的参数,以允许远程连接

所以你并不需要在在同一台机器上的xWindows环境使魔法发生...

示例或参数传递给java

-Dcom.sun.management.jmxremote.port=9005\ 
-Dcom.sun.management.jmxremote.authenticate=false\ 
-Dcom.sun.management.jmxremote.ssl=false 
+0

请注意,上述参数会打开一个巨大的安全漏洞,所以不要在生产环境中运行该漏洞! – demaniak

+0

应用程序已经运行没有一个简单的控制台的替代? –

+0

也许看看[jmxterm](http://wiki.cyclopsgroup.org/jmxterm) - 本质上你正在寻找一个基于控制台的JMX客户端 – demaniak

1

号。你不能强迫垃圾收集器执行垃圾收集。使用System.gc(),您只能请求垃圾回收器执行垃圾回收。

+0

你显然没有读过我的第二点。 –

-1

考虑使用Oracle JRockit JVM运行您的程序。在那里,您可以使用JRCMD并发出JVM级别的管理命令/监视,包括强制GC。这是正确的,(在JRockit和其他地方),System.gc()做不是必然做什么

+0

嗨,“-1”,谨慎解释为什么你觉得这不是一个答案? – mgaert

+0

这是生产中的应用我无法开始修改环境。 –

+0

然后请确保您的问题是准确的,而不是downvoting。对于初学者,请解释“控制台”的含义。 “JConsole”,大概是这样,但我们最好不要在这里做出假设,对吧? – mgaert

2

实际上,来自JDK的jmap工具将触发完整的GC。试试jmap histo

+0

在我们的JVM上,它似乎只有在运行jmap histo时才会触发完整的GC:live。 –