0

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

只是为了抢占一些回复:

  • 我知道我可以用 JVisualVM 做到这一点,但我只有控制台访问权限,没有 X-Windows 访问权限
  • 我知道 System.gc() 只请求垃圾收集它不会强制它,但这似乎是 3. 工作,所以我正在寻找一种外部调用的方法。
  • 我知道你不应该对正在运行的应用程序进行垃圾收集,我这样做是作为检查潜在内存泄漏过程的一部分。
  • 该应用程序正在生产中运行我无法修改其环境,jvm 等
4

5 回答 5

2

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

  • 相关端口开放
  • java 进程以正确的参数启动以允许远程连接

因此,您无需在同一台机器上的 xWindows 环境中实现魔法……

传递给 java 的示例或参数

-Dcom.sun.management.jmxremote.port=9005\   
-Dcom.sun.management.jmxremote.authenticate=false\ 
-Dcom.sun.management.jmxremote.ssl=false
于 2013-01-23T08:59:53.383 回答
2

创建一个仅执行 System.gc() 的简单 Java 代理。使用它的 pid 附加到目标 JVM 并运行它。从这里开始: http: //docs.oracle.com/javase/6/docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html

于 2013-01-23T09:36:27.437 回答
2

实际上JDK中的jmap工具会触发full GC。试试 jmap histo

于 2013-01-23T11:55:50.187 回答
1

不。您不能强制垃圾收集器执行垃圾收集。使用 System.gc() 只能请求垃圾收集器执行垃圾收集。

于 2013-01-23T08:59:22.573 回答
-1

考虑使用 Oracle JRockit JVM 运行您的程序。在那里,您可以使用 JRCMD 并发出 JVM 级别的管理命令/监控,包括强制 GC。没错,(在 JRockit 和其他地方), System.gc()不一定任何事情

于 2013-01-23T09:30:51.420 回答