Java 不使用 JVMTI 强制垃圾收集?
Java Force Garbage collection without using JVMTI?
我知道强制垃圾回收的唯一方法是使用 JVMTI 的 ForceGarbageCollection()。有没有什么跨平台的方式来force 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
并想出“有趣”的使用方法……却没有意识到这是一种昂贵且(最终)不可靠的机制。
我知道强制垃圾回收的唯一方法是使用 JVMTI 的 ForceGarbageCollection()。有没有什么跨平台的方式来force 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
并想出“有趣”的使用方法……却没有意识到这是一种昂贵且(最终)不可靠的机制。