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

具有隔离循环引用的垃圾回收行为?

壤驷子安
2023-03-14
问题内容

如果堆上有两个互相引用的对象,但它们没有链接到任何引用变量,那么这些对象是否可以进行垃圾回收?


问题答案:

对,他们是。基本上,GC从“已知根”(静态变量,来自alll线程中所有堆栈帧的局部变量)中查找无法进行垃圾回收的对象。如果无法从根目录访问对象,则可以收集该对象。

编辑:汤姆指出了这一点,我认为值得将答案本身引入:

从技术上讲,静态变量不是根-它们是由类加载器所引用的类所引用的,而类加载器则是由对象所引用的类所引用的,而对象被根引用所引用。

大多数情况 下,这种差异可能无关紧要,但是很高兴知道:)



 类似资料:
  • 问题内容: 根据我的理解,如果没有其他“指向”该对象的内容,则Java中的垃圾回收会清除某些对象。 我的问题是,如果我们有这样的事情怎么办: 和应该被垃圾回收,但是它们都被其他对象引用。 Java垃圾回收如何处理呢?(或者仅仅是内存消耗?) 问题答案: 如果无法通过从垃圾回收根开始的链访问对象,Java的GC会将其视为“垃圾”,因此将收集这些对象。即使对象可能指向彼此以形成一个循环,但如果将它们与

  • 问题内容: 如果我使用String.intern()来提高性能,因为我可以使用“ ==”来比较内部字符串,是否会遇到垃圾回收问题?内联字符串的垃圾回收机制与普通字符串有何不同? 问题答案: 实际上,这不是垃圾收集优化,而是字符串池优化。调用时,您用其基本引用(首次遇到此字符串的引用,如果尚不知道此引用,则为参考)替换对初始String的引用。 但是,一旦您的字符串不再在应用程序中使用,它将成为垃圾

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的

  • 垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃

  • 问题内容: 在学习OCJP时,我遇到了以下问题: 当// doStuff到达时,有多少个对象可以使用GC? 正确答案是2,含义及其目的。 当到达// doStuff行时,c3也为null。为什么它也没有资格获得GC? 问题答案: c3是带有空引用的本地句柄,它不指向(并且已经指向了)分配的对象。因此,GC无需任何操作。