繁体   English   中英

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

[英]Is this java Object eligible for garbage collection in List

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

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的引用返回给外部世界。

GarbageCollector不会收集Boss对象,因为它们仍会在您发布的代码块中引用。 bossList是一个ArrayList ,它有一个Object的内部数组,因此保存对添加到它的那些对象的引用。

我这样的情况不仅考虑了你的参考,而且涉及所有对象的所有参考。

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

ArrayList内部有Object[] elementData 当你向bossList ArrayList添加b ,指定了elementData[0] = b 因此,当您为b分配null ,仍然会从elementData[0]引用Boss实例并且无法进行GCed。 但是,由于ArrayList实例仅在方法返回之后从方法的变量引用,因此ArrayListBoss实例都符合GC的条件。

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

你好

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM