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

java-垃圾收集器如何快速知道哪些对象不再对其进行引用?

范轶
2023-03-14
问题内容

我了解在Java中,如果某个对象不再有对其的任何引用,则垃圾收集器将在一段时间后将其回收。

但是,垃圾收集器如何知道一个对象是否具有与之关联的引用?

垃圾收集器是否使用某种哈希图或表?

编辑:

请注意,我并不是在问gc的一般工作原理。真的,我不是问这个。

我要 特别 问的 ,gc如何高效地知道哪些对象是活的,哪些对象是死的。

这就是为什么我在我的问题中说gc维护某种hashmap或set,并不断更新对象具有的引用数?


问题答案:

典型的现代JVM使用几种不同类型的垃圾收集器。

一种经常用于已经存在一段时间的对象的类型称为Mark-and-
Sweep
。它基本上涉及从已知的“活动”对象(所谓的
垃圾回收根 )开始,遵循所有对象引用链,并将每个可到达的对象标记为“活动”。

完成此操作后, 清除 阶段可以回收那些尚未标记为“活动”的对象。

为了使此过程正常运行,JVM必须知道每个对象引用在内存中的位置。这是
精确

实现垃圾收集器(Java是)的必要条件。



 类似资料:
  • 有人能给我解释一下原因吗?

  • [GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1

  • 在下面的代码中,假设调用了。最初引用的对象在哪一点/哪一行符合垃圾收集的条件? 如果或有一个公共、受保护、默认或静态的访问修饰符,它会影响对象在什么点上有资格进行垃圾收集吗?如果是,它会受到什么影响? 我的第一个想法是,当测试对象有资格进行垃圾收集时,该对象有资格进行垃圾收集

  • 问题内容: 如何防止对象收集垃圾? 是否有通过终结或幻影引用的方法或任何其他方法? 采访中有人问我这个问题。面试官建议可以使用。 问题答案: 保持参考。如果过早地收集了对象,则表明您的应用程序设计中存在错误。 垃圾收集器仅收集应用程序中没有引用的对象。如果没有可以自然引用所收集对象的对象,请问自己为什么要保持它的生命。 通常没有引用但想要保留一个对象的一个​​用例是单例。在这种情况下,您可以使用静

  • 问题内容: 我有两节课 假设我在代码中使用对象B [say ],并在最终使用它后将其设置为。我知道B的对象现在可用于垃圾回收了。 我知道在将b设置为null之后,它将 立即有资格 进行垃圾回收吗?但是类型A的对象呢?将B设置为以后,是否可以 立即 将其用于垃圾回收?还是 在B被垃圾回收之后 才有资格 进行 垃圾回收 ? 从理论上讲,在对B进行垃圾收集之前,还有参考吗?因此,SUN JVM编译器将在