当前位置: 首页 > 面试题库 >

检查垃圾收集器是否可以获取对象

养枫涟
2023-03-14
问题内容

有没有一种方法可以检查垃圾收集器是否可以提取对象?

在我的代码中的某个地方,我有一个对象的引用:

MyObject mo = myObject;

然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null:

mo = null;

有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用?

非常感谢,

斯特凡


问题答案:

您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种选择可能会根据您的需要而适用:

  1. 将引用设置为后,进行堆转储null,然后将其加载到堆分析器工具(如jhat或支持该分析器的探查器)中。这些工具应使您能够从GC根目录遍历路径,从而检查对象是否仍然可以访问。
  2. 将对象包装在给定的PhantomReference中ReferenceQueue。将引用放入队列后,您就知道该对象已被垃圾回收。(不幸的是,如果未对引用进行排队,则可能是因为该对象仍然可以访问,或者可能是因为GC尚未检查该对象。对于所有与GC相关的问题,垃圾回收不是确定性过程! )

总的来说,我同意最好的选择是 了解
内存泄漏问题,并设计应用程序来避免这些问题。如果确实有内存泄漏,那么它应该很明显,然后您就可以将精力集中在发现问题上(再次通过转储并分析堆中无法正确访问的对象)。

上面的步骤比较耗时,不应该在每次更改后都只是为了确保自己而做,而是用来调查 特定 问题的工具。



 类似资料:
  • 问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分

  • 我已经读到,在以下情况下,对象可以进行垃圾收集。 该对象的所有引用都显式设置为null 但是,是否有无论如何要标识的对象是合格的垃圾回收机制是由垃圾收集器收集?

  • 问题内容: 该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。 我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线

  • 问题内容: Java垃圾收集器以优先级1运行,因此不能保证System.gc()如果被调用将实际执行。 有什么办法可以改变其优先级?如果需要,这将使我能够运行。 问题答案: 垃圾收集器是一个独立线程(如TomHawtin在评论中所提醒,甚至不一定是单个线程),并且其优先级由Java虚拟机确定。这意味着您不能强制垃圾回收。调用告诉运行时环境“现在”可能是运行GC的好时机,但实际上并不能保证立即进行垃

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T