【问题标题】:Will this List be Garbage Collected?这个列表会被垃圾收集吗?
【发布时间】:2019-01-14 06:01:45
【问题描述】:

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

但是,这是否也包括对子对象的引用?

例如,假设我们有这段代码

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

【问题讨论】:

  • 这是否意味着如果垃圾收集了列表,还是因为它包含的对象正在其他地方使用(静态 Foo foo)? - 它得到垃圾收集,因为列表只存在于方法内部。您只返回第一个元素,这样该对象就不会被垃圾收集,其他一切都会。

标签: java memory memory-management garbage-collection


【解决方案1】:

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

可以对列表进行垃圾收集。正如您所说,只有您保留引用的Foo 才需要保留。一个对象没有被保留,因为 it 引用了另一个对象;只有当一些其他对象引用 it 时,才会保留一个对象。

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

【讨论】:

  • 由于 if B 引用...解释而被接受。大卫的回答也不错,这个只是稍微全面一点
【解决方案2】:

list 是一个局部变量,它引用的对象没有被超出此方法范围的另一个对象引用。因此,当getFoo() 返回时,List 对象就有资格被垃圾回收。
只有列表的第一个元素没有资格成为 GC,因为 foo 字段引用了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多