Java终结器,真正需要的任务

时间:2013-06-15 16:01:13

标签: java arrays object dynamic-arrays

ArrayList<Object> foo;
Object[] bar;

典型的终结者会做

foo = null;
bar = null;

我的问题是,ArrayList会调用一个终结器,它会将它保存的任何指针设置为null,或者我必须单步执行列表吗

for(i=1; i<foo.size(); i++) foo.set(i,null); ???

另一个问题是:对于数组,我是否需要将其任何内容设置为null,如

for(i=1; i<bar.length; i++) bar[i] = null;

或者是否足以将整个内存块丢弃并且之后的任何指针都超出范围?

很抱歉,如果问题很愚蠢。

在阅读了我发现的答案之后,你自己就没有什么可以实现的了。

有些消息来源表示,如果发生类似这样的事情(内存吃应用程序),那就是糟糕的设计。

我的核心问题是:经常做

struct = new LargeStructure();

这会不会记忆?

或者这只需要这种结构之一的记忆吗?

BTW:问题出现在运行tomcat的webapp中,并且只有一个会话处于活动状态,它将所描述的指针保存为会话变量。

4 个答案:

答案 0 :(得分:4)

当垃圾收集器不再被引用时,它们将自动符合垃圾收集器的GC条件。你不必担心它。如果要将数组引用设置为null,那么如果没有对数组对象的其他实时引用,则数组对象本身符合GC条件,如果没有实时,则数组的元素将符合GC的条件再次引用它们。

根据documentation

protected void finalize() throws Throwable
  

当垃圾收集确定没有对该对象的更多引用时,垃圾收集器在对象上调用。子类重写finalize方法以处置系统资源或执行其他清理。 / p>

在GC检测到对象不再可访问之后,以及在实际回收对象使用的内存之前,将调用finalize()方法。如果对象永远无法访问,或GC未运行,则可能永远不会调用finalize()

您可以尝试强制JVM通过调用System.runFinalization()来呼叫finalize()

  

运行待完成的任何对象的终结方法。

     

调用此方法表明Java虚拟机花费精力来运行已被发现被丢弃但尚未运行其终结方法的对象的finalize方法。 当控制从方法调用返回时,Java虚拟机已尽最大努力完成所有未完成的终结。

答案 1 :(得分:1)

理论上,终结器允许您在对象通过垃圾回收进行回收之前执行对象的最后一分钟任务。但实际上并不能保证它们会被调用,因此它们不是很有用。

答案 2 :(得分:0)

您不必在终结器块中设置对象对null的引用。 Finalizer用于最后机会资源关闭,这不是一个好习惯,但终结器可以为您提供资源管理的安全网。

答案 3 :(得分:0)

  

我的问题是,ArrayList会调用一个终结器,它会将它保存的任何指针设置为null,或者我必须单步执行列表吗

ArrayList不会调用终结器,终结器线程会这样做,但你不必担心。此外,您无需查看列表并最终确定自己的元素。 Java垃圾收集器会为您确定一个,并且只要它们未在代码中的任何其他位置引用,就会选择这些对象。

  

另一个问题是:对于数组,我是否需要将其任何内容设置为null,如

不,与上述相同。要记住的重要一点是,如果您希望垃圾收集器将其拾取,则不会引用数组中的任何值,也不会引用数组本身。