会收集垃圾清单吗?

时间:2018-08-07 08:06:14

标签: java memory memory-management garbage-collection

我从同龄人那里听说,当对象周围仍然存在引用时,不会发生垃圾回收。

但是,这还包括对子对象的引用吗?

例如,假设我们有此代码

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中的调试器收集的垃圾内容?

2 个答案:

答案 0 :(得分:1)

list是一个局部变量,该方法范围之外的另一个对象未​​引用它引用的对象。因此,当getFoo()返回List对象时,就有资格进行垃圾回收。
由于foo字段引用了该列表,因此只有列表的第一个元素才有资格获得GC。

答案 1 :(得分:1)

  

这是否意味着该列表是否已被垃圾回收,还是不是因为其中包含的对象正在其他地方(静态Foo foo)使用?

该列表可以被垃圾回收。如您所说,只需保留您引用的一个Foo即可。没有保留对象,因为引用了另一个对象。仅当某些其他对象引用 it 时,该对象才保留。

更简单地说:如果B引用A,而C也引用A,但是没有引用B,则B有资格进行垃圾回收。 B引用A的事实(不符合垃圾回收的条件,因为C引用了它)并不意味着B被保留了。