此java对象是否符合List中的垃圾回收

时间:2013-05-31 05:35:52

标签: java collections arraylist garbage-collection

我所问的可能是一个愚蠢的问题所以请原谅我。 所以它是这样的:

List<Boss> bossList = new ArrayList<Boss>();
Boss b = null;
for(Employee e : List<Employee> myList){
    b = new Boss();
    b.setEmployee(e);
    bossList.add(b);
    b = null;
}

所以在上面的场景中,我创建了很多Boss对象,然后取消引用它们(我知道我不需要写“b = null”,但我这样做是为了清楚我的问题)。在正常情况下,我会将它们标记为垃圾收集,通过执行此操作,但因为在这种情况下,我在List集合中添加了这些Boss对象,它们是否标记为GC?如果不是那么为什么? List集合如何在内部工作以保存每个添加的Object的引用,以避免垃圾回收?

[EDIT] 

问题范围仅限于在for循环中创建的各个Boss对象,考虑到此方法将List的引用返回给外部世界。

4 个答案:

答案 0 :(得分:9)

Boss将不会收集GarbageCollector个对象,因为它们仍会在您发布的代码块中引用。 bossListArrayList,其内部数组为Object,因此保留了对添加到其中的对象的引用。

在这种情况下,不仅会考虑您的参考情况,还会考虑所有相关对象的参考资料。

编辑:由于您在代码中返回List,因此在您的程序中不再引用该列表之前,不会将对象标记为垃圾回收。

答案 1 :(得分:5)

ArrayList内部有Object[] elementData。将b添加到已分配bossList的{​​{1}} ArrayList时。因此,当您将elementData[0] = b分配给null时,b的实例仍会从Boss引用,并且无法进行GC操作。但是,由于elementData[0]实例仅在方法返回后被引用,因此ArrayListArrayList实例都符合GC的条件。

答案 2 :(得分:3)

以下是您的代码真正发生的事情:

Hello

答案 3 :(得分:-1)

由于java是通过引用传递的,因此无论何时将b添加到bossListbossList都会开始引用b指向的内存位置。因此,当b无效时,只有从b到引用的链接被破坏。从而通过bossList保持对象可访问。