gpt4 book ai didi

java - 有没有一种方法可以在 Java 中启动积极且完整的垃圾收集?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:32 24 4
gpt4 key购买 nike

出于内存优化的原因,我在分析期间自己启动了垃圾收集器,以检查对象在处理后是否被正确清理。

不过,对垃圾收集器的调用还不够,而且似乎无法保证它会清理什么。

有没有办法调用它,以确保它在分析条件下尽可能多地恢复(当然,这在生产中没有意义)?还是“多次调用”是“几乎确定”的唯一方法?

或者我只是误解了垃圾收集器的某些内容?

最佳答案

总的来说,“完全垃圾回收”是不明确的。 GC 检测无法访问的对象,并回收它们。碰巧大多数 GC 实现都在“循环”的基础上运行,并且一旦运行了一个完整的循环,就可以定义一个合理的“回收空间”概念。因此,如果您可以运行一个完整的周期并且该周期根本没有发现可回收空间,并且应用程序处于“空闲”状态(例如不更新指针),那么您可以说您暂时达到了“完全收集”点.

因此,您可能想做这样的事情:

Runtime r = Runtime.getRuntime();
r.gc();
long f = r.freeMemory();
long m = r.maxMemory();
long t = r.totalMemory();
for (;;) {
r.gc();
long f2 = r.freeMemory();
long m2 = r.maxMemory();
long t2 = r.totalMemory();
if (f == f2 && m == m2 && t == t2)
break;
f = f2;
m = m2;
t = t2;
}
System.out.println("Full GC achieved.");

此代码依赖于一些假设,其中最重要的是 Runtime.gc() 不仅仅是一个“提示”,而且确实会强制执行某些 GC Activity 。 Sun 的 JVM 可以使用“-XX:-DisableExplicitGC”标志启动,它将 Runtime.gc() 转换为空操作,有效地阻止上面的代码执行任何操作。

还有一些注意事项:

  • JVM 可能有一些后台连续 Activity ,例如计时器 线程。某些 Activity 可能是“隐藏的”,即不是应用程序开发人员编写的代码。另外,想想 AWT/Swing 事件调度程序线程。

  • GC 运行可能会通过可终结对象或软/弱/虚引用触发额外的异步 Activity 。此类 Activity 必然是异步的,并且可能会运行无限长的时间。 Runtime.gc() 不会等待它完成。这实际上是一个定义问题:如果尚未处理终结器和引用队列,是否认为 GC 是“完整的”?

  • 没有真正强制上面的代码终止...

对于“更完整”的 GC,您可以使用 JVMTI 接口(interface)(调试器使用的接口(interface)),它允许您运行 GC,但暂停目标 JVM 线程,这使得它更容易定义和实现“完整的 GC”状态。

关于java - 有没有一种方法可以在 Java 中启动积极且完整的垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com