我应该将null设置为object以从内存中删除吗?

时间:2013-10-05 14:45:44

标签: java object jvm

例如:

public class Box{
    public int id;

    public Box(int id){
        this.id = id;
    }
}

ArrayList<Box> boxArray = new ArrayList<Box>();

boxArray.add(new Box(0));
boxArray.add(new Box(1));
boxArray.add(new Box(2));

for (Iterator<Box> iter = boxArray.iterator(); iter.hasNext();) {
    Box box = iter.next();

    if (box.id == 1) {
        iter.remove();
        box = null;
    }
}

我知道:在Java中,JM是没有referance的删除对象。

但是

  1. 我应该设置“box = null;”从数组中删除它后,在此代码中对象?
  2. 如何确保该对象肯定会从JM中删除?

3 个答案:

答案 0 :(得分:6)

  

1)我应该设置“box = null;”从数组中删除它后,在此代码中对象?

没有。这样做是浪费时间。

  

2)我怎样才能确保对象肯定会从内存中删除?

您无法确定它是否会被删除。但是,如果JVM 需要内存,可以确保将删除无法访问的对象。这就是真正重要的事情。


  

我知道:在Java中,JVM会在没有引用时删除对象。

这不完全正确。我们可以说如下:

  • 任何活动线程不再可以的对象符合条件用于垃圾回收。 (这与说没有对象的引用不同。)

  • 当垃圾收集器运行时,它通常会回收一些无法访问的对象,但不一定全部回收。

  • 如果对象具有finalize方法,则该方法可能导致对象避免被回收。

所有这些加起来“将删除”太强大了。此外,删除不会立即发生。

答案 1 :(得分:1)

  

我应该设置“box = null;”从数组中删除它后,在此代码中对象?

不,没有特别需要这样做,因为只要for循环结束,Box引用就不再存在具有相同的效果。在使用Java编程时,内存管理不用担心。

  

如何确保该对象肯定会从JM中删除?

你做不到。当垃圾收集器感到需要时,该对象将被垃圾收集。

答案 2 :(得分:1)

  1. 不,你不应该。无论如何,“box”变量不存在于循环之外。

  2. 您不能确定某个对象“已删除”,您也不应该关心。在内容无法访问时从内存中删除对象将非常慢,GC更喜欢批量工作并自行保存。