繁体   English   中英

我们如何知道一个对象是否被 GC 标记为垃圾?

[英]How can we know whether an object is marked as garbage by GC?

是否有任何工具可以可视化特定对象上的 GC 状态?

如果您可以访问该对象,则它基本上是不可收集的。

JVMTI 系统(Java 虚拟机工具接口)允许其他进程链接到 JVM 并从中获取统计信息。 这是调试器和分析器使用的东西; visualvm(与大多数 JDK 一起提供)可以做到这一点,许多商业产品也可以做到这一点。 他们为您提供了一些 GC 见解。

JDK 本身也可以这样做,使用-XX:+PrintGCDetails -阅读本文了解更多信息。

在同一个 JVM 中,您可以使用java.lang.ref的类来引用对象而不妨碍垃圾收集。 琐碎:

class Test {
  private final WeakReference<String> weakRef;

  public void test() {
    String y = new String("");
    weakRef = new WeakReference<>(y);
  }

  public boolean hasItBeenCollectedYet() {
    // weak refs don't impede collection; `.get()` returns null once
    // the object begins its collection process.
    return weakRef.get() == null;
  }
}

但是,使用该系统来收集一般统计数据? 它不是很好 - 其他两个选项要好得多。

简短的回答是没有好的方法。

并且没有任何方法可以在不(以各种方式)改变您尝试检查的对象的行为的程序中执行此操作。

“不好”的方法是:

  • 通过使用Reference类型。 问题是这会改变对象的生命周期,并且只告诉您在 GC 运行的最后一个时间点对象的状态。

  • 通过获取堆转储并使用堆转储分析器进行检查。 问题是进行堆转储是一个昂贵的“停止世界”事件,它使用大量磁盘空间并且需要大量 RAM 来加载和分析转储。

最后,除非您正在搜索可疑的内存泄漏,否则您可能不会通过这样做学到很多东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM