我从同龄人那里听说,当对象周围仍然存在引用时,不会发生垃圾回收。
但是,这还包括对子对象的引用吗?
例如,假设我们有此代码
public class Bar {
public static Foo foo = getFoo();
private static Foo getFoo() {
List<Foo> list = List.of(new Foo(), new Foo(), new Foo());
return list.get(0);
}
}
然后在整个程序生命周期中使用foo。
但是,该列表不再需要,可以被垃圾回收。唯一不能被垃圾收集的是第一个Foo。
这是否意味着该列表是否已被垃圾回收,还是不是因为其中包含的对象正在其他地方(静态Foo foo)使用?
还要检查与内存管理相关的内容,是否有办法查看使用IntelliJ中的调试器收集的垃圾内容?
答案 0 :(得分:1)
list
是一个局部变量,该方法范围之外的另一个对象未引用它引用的对象。因此,当getFoo()
返回List
对象时,就有资格进行垃圾回收。
由于foo
字段引用了该列表,因此只有列表的第一个元素才有资格获得GC。
答案 1 :(得分:1)
这是否意味着该列表是否已被垃圾回收,还是不是因为其中包含的对象正在其他地方(静态Foo foo)使用?
该列表可以被垃圾回收。如您所说,只需保留您引用的一个Foo
即可。没有保留对象,因为它引用了另一个对象。仅当某些其他对象引用 it 时,该对象才保留。
更简单地说:如果B引用A,而C也引用A,但是没有引用B,则B有资格进行垃圾回收。 B引用A的事实(不符合垃圾回收的条件,因为C引用了它)并不意味着B被保留了。