有效的Java项目7:避免终结器

有效的Java项目7:避免终结器,java,garbage-collection,finalizer,effective-java,Java,Garbage Collection,Finalizer,Effective Java,在这本了不起的书中,作者Josh Bloch提到: “哦,还有一件事:使用终结器会带来严重的性能损失。在我的机器上,创建和销毁简单对象的时间约为5.6 ns。添加终结器会将时间增加到2400 ns。换句话说,使用终结器创建和销毁对象的速度要慢430倍。” 有没有一种方法可以在java中删除和删除对象? 我认为我们可以简单地让对象超出范围或将其重置为null。我打算在我的机器上进行试验,这似乎是一个有趣的想法,但我不确定如何删除和对象。一旦您使引用变量引用null(假设上次引用)并且该变量超出其作

在这本了不起的书中,作者Josh Bloch提到:

“哦,还有一件事:使用终结器会带来严重的性能损失。在我的机器上,创建和销毁简单对象的时间约为5.6 ns。添加终结器会将时间增加到2400 ns。换句话说,使用终结器创建和销毁对象的速度要慢430倍。”

有没有一种方法可以在java中删除和删除对象?

我认为我们可以简单地让对象超出范围或将其重置为null。
我打算在我的机器上进行试验,这似乎是一个有趣的想法,但我不确定如何删除和对象。

一旦您使引用变量引用
null
(假设上次引用)并且该变量超出其作用域,则该对象有资格在下一个垃圾收集周期进行垃圾收集。

当不再有任何强根引用指向该对象时,该对象将不再存在;在大多数情况下,这正是应该发生的事情。但是,在某些情况下,对象会要求外部实体代表其做一些事情,可能会损害其他实体的利益,以换取承诺让其他实体知道何时不再需要其服务。例如,“文件”对象可能要求操作系统以独占方式访问文件;在操作系统被告知不再需要这种访问之前,它将阻止其他所有人使用该文件

如果作出这种承诺的一个对象被放弃,不再存在,外部实体将继续做它被要求做的任何事情,损害其他所有人,即使它的行为不再对任何人有利。为了避免这种情况,Java允许对象在GC发现它们似乎已被放弃时请求通知。此类通知将在对象停止存在之前发出(即对此类对象调用
Finalize
),但除此之外,无法真正保证及时性。最终确定的对象可以通知代表其行事的任何和所有实体他们应该停止这样做


Java的创建者可能期望终结器是对象通知外部实体不再需要其服务的主要机制,但是终结器确实不能很好地工作。其他机制,如
AutoCloseable
PhantomReference
在许多情况下都更好。

嘿!谢谢你的快速回复。我想知道如何计算创建和删除b/c之间的时间重置为空只是使其符合条件,它实际上不会删除它。@mohit-实际上,您需要将所有引用重置为空。该对象应该是不可访问的(当它超出范围并从堆栈中弹出引用时会发生这种情况)。@mohit除了JVM之外,没有任何东西“删除”它,从技术上讲,您无法控制GC何时运行。您可以建议它应该运行,并且许多实现在您建议它时都会运行它。@mohit尝试使用Java探查器,如JProfiler或YourKit。除非您特别需要终结器,否则您不需要使用终结器。检查@Dave是的,您是对的。我理解这一点,也看到了下面对Eran的回复评论,但我想知道作者是如何计算创建和删除之间的时间的。很明显,他说的是abt删除,而不是对象的删除状态。谢谢你抽出时间来帮助我。