【问题标题】:Should i set null to object for delete from memory?我应该将 null 设置为对象以从内存中删除吗?
【发布时间】:2013-10-05 14:45:43
【问题描述】:

例如:

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 在没有引用时是删除对象。

但是

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

【问题讨论】:

  • 你不知道,除非你知道它在其他地方被引用。

标签: java object jvm


【解决方案1】:

1) 我应该设置“box = null;”吗是否从数组中删除此代码后在此代码中添加对象?

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

2) 我如何确保该对象肯定会从内存中删除?

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


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

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

  • 任何活动线程不再可访问的对象有资格进行垃圾回收。 (这和说没有对象的引用是不一样的。)

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

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

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

【讨论】:

    【解决方案2】:

    我应该设置“box = null;”吗?是否从数组中删除此代码后在此代码中添加对象?

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

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

    你不能。当垃圾收集器认为需要时,该对象将被垃圾收集。

    【讨论】:

      【解决方案3】:
      1. 不,你不应该。无论如何,“box”变量都不存在于您的循环之外。

      2. 您不能确定某个对象“已被移除”,您也不应该在意。在无法访问的时候从内存中删除对象会非常慢,GC 更喜欢分批工作并自己记账。

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 2023-03-04
        • 2012-03-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多