[英]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
实例仅在方法返回之后从方法的变量引用,因此ArrayList
和Boss
实例都符合GC的条件。
由于java是通过引用传递的,所以无论何时将b
添加到bossList
, bossList
开始引用b指向的内存位置。 因此,当b
无效时,只有从b
到引用的链接被破坏。 从而通过bossList
保持对象可访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.