2

在这本令人惊叹的书中,作者 Josh Bloch 提到:

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

有没有办法可以在java中删除和对象?
我认为我们可以简单地让对象超出范围或将它们重置为空。
我打算在我的机器上进行实验,这似乎是一个有趣的想法,但我不知道如何删除和反对。

4

2 回答 2

2

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

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

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

于 2014-10-15T20:19:53.130 回答
2

一旦您使引用变量引用null(假设最后一个引用)并且该变量超出其范围,那么该对象就有资格在下一个垃圾收集周期进行垃圾收集。

于 2014-10-15T11:56:16.963 回答