Java GC如何在这样的简单情况下工作:
ArrayList<Object> list = new ArrayList<>();
list.add(new Object());
list.add(new Object());
//do something with objects
list.remove(0);
答案 0 :(得分:1)
通常情况下,如果使用,请使用&#34;对象做对象&#34;这导致它们被保留,然后尽管list.remove
调用它们也不会被垃圾收集。
同时尝试确保在尽可能短的范围内声明list
。这是最接近使用的地方。这会使列表自动超出范围并且早些时候就是GC。
有时您可能希望在完成使用后将对象设置为null。这也可以使其脱离范围并符合GC的条件。
答案 1 :(得分:1)
首先关闭:班级Object
不是“未命名的班级”。如果有的话,可以在anonymous classes的上下文中使用这个术语。
GC保留所有活着的对象,即从GC根目录可以访问的对象。所有其他对象都被丢弃。局部变量(以及其他)GC根源。
您所描述的是没有直接指向您的对象的引用变量的情况,例如Object myObj = new Object();
。
但是,有一个列表包含对象的引用。
现在,如果要运行GC会发生什么?
在list.remove(0);
之前,您的对象将被标记为活着,因为它是
通过清单间接到达。
list.remove(0);
之后(并假设“对象做了些事”
不涉及建立对你的对象的另一个引用)
GC不会将对象标记为活动,因为它无法访问
了。之后被你的对象占用的内存将是
标记为免费。