未命名的类上的垃圾收集

时间:2016-04-05 08:11:23

标签: java class arraylist garbage-collection

Java GC如何在这样的简单情况下工作:

ArrayList<Object> list = new ArrayList<>();

list.add(new Object());
list.add(new Object());
//do something with objects
list.remove(0);

2 个答案:

答案 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不会将对象标记为活动,因为它无法访问 了。之后被你的对象占用的内存将是 标记为免费。