2016-04-04 77 views
0

说我做这样的事情:Java的垃圾回收和集合

List<Stuff> methodA() { 
    List<Stuff> all_the_stuff_to_do = new ArrayList<>(); 
    all_the_stuff_to_do.add(new Stuff("important")); 
    all_the_stuff_to_do.add(new Stuff("not important")); 
    return all_the_stuff_to_do; 
} 

List<Stuff> methodB() { 
    List<Stuff> important_stuff_to_do = new ArrayList<>(); 
    Stuff important = methodA().get(0); 

    // at this point Stuff("not important") is not reachable anymore 
    // since I have no reference to the list that contains it left 

    important_stuff_to_do.add(important); 
    return important_stuff_to_do; 
} 

void methodC() { 
    ... do a happydance ... 

    List<Stuff> stuff_to_do = methodB(); 

    ... look sad because now I got important stuff to do ... 
} 

*****编辑*****
更好的澄清和简化代码

澄清:

当退出methodA()我得到了一个列表与两个对象的参考东西(“重要”)东西(“不是我mportant“)

我将对Stuff(”important“)的引用添加到methodB()的列表中。 此时对象东西(“不重要”)无法再到达。 同样在中的列表方法A()不再可用。

但是该列表仍然包含对确实可到达的对象的引用,即材料(“重要”)

何时会all_the_stuff_to_do列表中清除并当的东西(“不重要”)对象?

在拨打方法A后会直接吗?或者它会在方法B的末尾?或者从来没有,因为它包含对材料(“重要”)的引用直到程序结束仍然有效的对象?

+1

您指的是哪个列表引用? 'all_the_stuff_to_do','important_stuff_to_do'或'stuff_to_do'? – Cypher

+0

“东西(2)”是什么意思?你在打什么方法? –

+0

我想你可能的意思是:'important_stuff_to_do.add(methodA()。get(i));'在methodB中的for循环中 – JimmyJames

回答

1

在调用MethodA之后,会立即(all_the_stuff_to_do被垃圾回收)吗? 或者它会在MethodB的结尾?或者从来没有,因为它包含对Stuff(“重要”)对象的引用,该对象在程序结束前仍然处于活动状态?

垃圾回收通常是在低优先级的线程上完成的。如果没有其他事情正在完成,垃圾收集器可能会运行。

如果虚拟机处于低位或低位内存,垃圾收集器可能会立即作为最高优先级的线程运行,因为它需要为程序的直接需要恢复内存。

那么,在拨打MethodA之后会直接收集吗?号码在拨打get(0)后会被收集吗?可能,但不太可能。在MethodB的结尾?可能,但不太可能。在节目结束时仍然活跃?可能的,但只有当程序没有耗尽内存并且永远不会空闲时才有可能。

列表中包含“Stuff(”important“)Object”副本的事实与列表是否被收集无关。如果没有可访问的对象引用列表,则列表有资格进行垃圾回收。

在收集过程中,列表是否会得到#clear()?不,没有必要。如果它是一个用户定义的集合,那么clear方法可以执行任何操作,包括向列表中添加另一个引用,这会导致垃圾回收。相反,它只是被收集起来的,列表引用的对象被引用的时间少一次。包括“Stuff(”important“)Object”...它的引用计数会减少,但由于引用仍然存在,它不会被清除。

+0

谢谢这是我正在寻找的awnser – Xtroce

1

集合包含对您添加的对象的引用。在此之前不再可访问或者您从集合中删除对象时,它们将可到达。你能想出一种方式可以可靠地工作吗?

0

在你的场景中new Stuff("important")这里new关键字负责制作一个对象并引用这个Stuff对象由集合List <Stuff> important_stuff_to_do持有。现在这个集合将保存你所做的两个对象的引用。

收集定义我们所知道Collection是一组同类型的对象的多个对象作为单一实体

所以,没有Garbage Collection将执行因为这里这两个对象仍然可达

new Stuff("important") 
new Stuff("not important") 

注: - 垃圾收集只执行对象是完全不可达(一类孤立的)。这里没有对象变得孤儿,因为Collection从来没有对所添加的对象进行复制/修饰。

结论: - 没有垃圾将在这种情况下执行。谢谢

+0

@Vikrant_Kashyap我想我解释得太复杂了,现在看看,因为问题是Stuff(“不重要”)不可及 – Xtroce