不使用JVMTI的Java强制垃圾收集?

问题描述

我所知道的强制垃圾回收的唯一方法是使用来自 jvmtiForceGarbageCollection()。是否有任何跨平台的方式来强制 GC(所以我不需要为每个平台创建一个 jvmti 库)?

解决方法

我认为答案是否定的。

但我也认为你不需要这样做。

请求垃圾收集器运行的方法是调用System.gc()。但正如 javadoc 所解释的,这可以被忽略。

忽略 System.gc()正常原因是 JVM 已使用选项 -XX:+DisableExplicitGC 启动。这不是默认设置。只有当启动 JVM 的人或脚本或任何东西想要这种行为时,才会发生这种情况。

因此,您实际上是在寻求一种方法,让应用程序覆盖用户或管理员的显式指令以忽略 System.gc() 调用。你不应该那样做。超越用户的意愿不是应用程序或应用程序编写者的特权。

如果您的 Java 应用程序确实需要显式运行 GC,请在安装说明中说明不应使用 -XX:+DisableExplicitGC 选项运行它。然后System.gc() 应该工作。


那么为什么他们提供了一种禁用 gc() 调用的方法?

基本上是因为显式运行 gc() 是不好的做法(请参阅 Why is it bad practice to call System.gc()?)并且(几乎总是1)在正确编写的应用程序中是不必要的2.如果您的应用程序依赖于特定时间运行的 GC 来运行,那么您在应用程序设计上就犯了错误。

1 - 有几个例外是测试用例,用于使用 Reference 类型和类似类型的代码,以及您想要(比如)在关卡之间进行清理的交互式游戏避免在正常播放过程中出现 GC 暂停。
2 - Java 程序员从 C 或 C++ 程序员开始的情况并不少见。这些人可能很难意识到他们不需要参与 Java 内存管理。 JVM(几乎总是)对何时运行 GC 有更好的理解。人们也会遇到 Object.finalize 并梦想使用它的“有趣”方式......却没有意识到它是一种昂贵且(最终)不可靠的机制。