【问题标题】:Garbage Collection on an unnamed class未命名类的垃圾收集
【发布时间】:2016-07-25 01:19:25
【问题描述】:

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

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

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

【问题讨论】:

  • 然后你的第一个对象就有资格进行垃圾回收(假设“对对象做某事”不会做一些使其不合格的事情)。就是这样。
  • 啊,好的,谢谢。在我的实际程序中,我认为我在程序的其他地方使它不合格。

标签: java class arraylist garbage-collection


【解决方案1】:

首先:Object 类不是“未命名类”。如果有的话,人们会在anonymous classes 的上下文中使用这个术语。

GC 保留所有活动的对象,即从 GC 根可到达的对象。所有其他对象都被丢弃。局部变量是(除其他外)GC 根。

您所描述的是没有直接指向您的对象的引用变量的情况,例如Object myObj = new Object();

但是,有一个列表包含对您的对象的引用。

现在,如果 GC 运行会发生什么?

  • list.remove(0); 之前,您的对象将被标记为活动,因为它是 可以通过列表间接访问。

  • list.remove(0); 之后(并假设“用对象做某事” 不涉及建立对您的对象的另一个引用)您的 GC 不会将对象标记为活动的,因为它不可访问 了。之后你的对象占用的内存将是 标记为免费。

【讨论】:

    【解决方案2】:

    通常,如果在“对对象做某事”中使用导致它们被保留的对象,那么尽管有list.remove 调用,它们也不会被垃圾收集。

    还要尝试确保在尽可能短的范围内声明 list。那是最接近使用它的地方。这将使列表自动超出范围并更早地被 GC。

    此外,有时您可能希望在使用完对象后将其设置为 null。这也可以使它脱离范围并有资格获得 GC。

    【讨论】:

    • 在第三段中,您提到将对象设置为空。您的意思是将对象的列表位置设置为空吗?
    • 不,我的意思是在您处理完列表中的对象后将其设置为 null 。
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 2012-10-06
    • 2011-01-21
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多