我可以强制正在运行的 Java 应用程序从控制台进行垃圾收集吗?
只是为了抢占一些回复:
- 我知道我可以用 JVisualVM 做到这一点,但我只有控制台访问权限,没有 X-Windows 访问权限
- 我知道 System.gc() 只请求垃圾收集它不会强制它,但这似乎是 3. 工作,所以我正在寻找一种外部调用的方法。
- 我知道你不应该对正在运行的应用程序进行垃圾收集,我这样做是作为检查潜在内存泄漏过程的一部分。
- 该应用程序正在生产中运行我无法修改其环境,jvm 等
我可以强制正在运行的 Java 应用程序从控制台进行垃圾收集吗?
只是为了抢占一些回复:
JVisualVM 可以连接到远程进程,如果
因此,您无需在同一台机器上的 xWindows 环境中实现魔法……
传递给 java 的示例或参数
-Dcom.sun.management.jmxremote.port=9005\
-Dcom.sun.management.jmxremote.authenticate=false\
-Dcom.sun.management.jmxremote.ssl=false
创建一个仅执行 System.gc() 的简单 Java 代理。使用它的 pid 附加到目标 JVM 并运行它。从这里开始: http: //docs.oracle.com/javase/6/docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html
实际上JDK中的jmap工具会触发full GC。试试 jmap histo
不。您不能强制垃圾收集器执行垃圾收集。使用 System.gc() 只能请求垃圾收集器执行垃圾收集。
考虑使用 Oracle JRockit JVM 运行您的程序。在那里,您可以使用 JRCMD 并发出 JVM 级别的管理命令/监控,包括强制 GC。没错,(在 JRockit 和其他地方), System.gc()不一定做任何事情!