Java 未命名类上的垃圾收集
Java GC如何在这样的简单情况下工作:Java 未命名类上的垃圾收集,java,class,arraylist,garbage-collection,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); ArrayList list=new ArrayList(); 添加(新对象()); 添加(新对象()); //用物体做点什么 列表。删除(0); 通常情况
ArrayList<Object> list = new ArrayList<>();
list.add(new Object());
list.add(new Object());
//do something with objects
list.remove(0);
ArrayList list=new ArrayList();
添加(新对象());
添加(新对象());
//用物体做点什么
列表。删除(0);
通常情况下,如果使用“对对象执行某些操作”中的对象使其保留,则尽管有列表,但不会对其进行垃圾收集。请删除调用
另外,请尝试并确保在尽可能短的范围内声明列表。最接近使用它的地方。这将使列表自动脱离范围,并更早地进行GC
此外,有时您可能希望在使用完对象后将其设置为null。这也有助于使其脱离范围并符合GC的条件 首先:类对象
不是“未命名类”。如果有的话,我们可以在上下文中使用这个术语
GC保留所有活动的对象,即可从GC根访问的对象。将丢弃所有其他对象。局部变量是(除其他外)GC根
您所描述的是没有直接指向对象的引用变量的情况,例如object myObj=new object()代码>
但是,有一个列表包含对对象的引用
现在,如果GC运行会发生什么
- 在<代码>列表之前。删除(0)代码>您的对象将被标记为活动对象,因为它是
可通过列表间接访问
- 在<代码>列表之后。删除(0)代码>(并假设“对对象执行某些操作”
不涉及建立对对象的另一个引用)您的
GC不会将对象标记为活动对象,因为它不可访问
不再之后,对象占用的内存将为
标记为免费的
然后,您的第一个对象符合垃圾收集的条件(假设“对对象执行某些操作”不会执行使其不符合条件的操作)。就这些。啊,好的,谢谢。在我的实际程序中,我想我使它在程序的其他地方不可迁移。在你的第三段中,你提到将对象设置为null。你的意思是将对象的列表位置设置为null吗?不,我的意思是在处理完列表中的对象后,将其设置为null。