Tag: 终结器

如何在Java中实现对象计数器

一位采访者问我这个问题 如何实现类Foo,您可以在其中计算该类的实例。 有更多的线程正在创建该类Foo的实例。 我用以下代码回复了这个问题 public class Foo { private static int count = 0; public Foo() { incrementCount(); } public void incrementCount() { synchronize (Foo.class) { count++; } } } 她再次问我这个问题 如果一个线程结束,计数器应该减少,你怎么能这样做? 我没有回答这个问题。 我知道finalize()方法,但它依赖于Garbage collector ,即使我们覆盖finalize() ,也会调用此方法。 我还没有解决方案,你能解释一下吗?

我们可以关闭终结器吗?

由于几乎没有什么保证关于什么时候,甚至终结器运行和终结器现在几乎被认为是气味 – 有没有办法说服JVM完全跳过所有的终结过程? 我问,因为我们有一个庞大的应用程序,当移动到一个较新的JVM(不确定在这个阶段)是什么看起来非常像终结者的已知问题(抛出exception,因此非常慢的GC) 。 添加 有关Java内存泄漏故障排除的讨论:终结? 建议在终结器中抛出exception时出现主要问题,因为这会大大减慢终结过程。 当内存变低并且堆转储的分析显示大量的Finalizer对象(超过10,000,000)时,我的问题显示为急剧减速 – 向我表明减速可能是他们的错,因为他们正在推迟GC。 显然我可能是错的。 我没有权力要求重构。

终结器对JVM的性能影响

根据这篇文章 ,在.Net中, 终结者实际上甚至比这更糟糕。 除了它们运行较晚(这对于许多种资源确实是一个严重的问题),它们也不那么强大,因为它们只能执行析构函数中允许的操作的子集(例如,终结器不能可靠地使用其他对象,而析构函数可以),即使在写入子集时,终结器也很难正确编写。 并且收集可终结的对象是昂贵的:每个可终结的对象,以及可从其获得的对象的潜在巨大图形,被提升到下一代GC生成,这使得通过一些大的倍数收集它更加昂贵。 这是否也适用于一般的JVM,特别是HotSpot?

如果Java finalize方法中存在无限循环或死锁,Finalizer线程将执行什么操作

如果Java finalize方法中存在无限循环或死锁 , Finalizer线程将执行什么操作。

java:wait(),notify()和synchronized块

我了解到调用Object的wait()方法将释放对象监视器(如果存在)。 但是我有一些关于通过另一个线程调用此对象的notify()问题: 如果另一个(第3个)线程同时拥有对象监视器,那么等待线程是否会被唤醒? 如果第三个线程在这个对象上调用wait() ,那么等待线程会被唤醒吗? 是否可以确定线程是否在等待通知特定对象(java 1.4 / java 5) 如果在finalize()方法中调用wait()会发生什么?

“终结者监护人”如何在java中工作?

“终结者监护人”[Effective Java,第30页]如何运作? 你用过它们了吗? 它解决了任何具体问题吗?

如果终结器使对象可达,该怎么办?

在Java中,当一个对象(它会覆盖它)时会调用finalize ,当它即将被垃圾回收时,所以当它无法访问时。 但是如果终结器使对象再次可达,那么会发生什么呢?

关闭应用程序时调用Java Finalize方法

我对finalize方法有疑问。 如果我有许多具有许多inheritance的类,那么当应用程序关闭时如何调用所有finalize方法?

在finalize期间引用对象

如果在finalize调用期间保存对当前对象的引用会发生什么? 例如: class foo { … public void finalize() { bar.REFERENCE = this; } } 对象是否被垃圾收集? 当您尝试访问bar.REFERENCE时会发生什么。稍后会bar.REFERENCE吗?

为什么终结器会有“严重的性能损失”?

有效的Java说: 使用终结器会严重影响性能。 为什么使用终结器破坏对象的速度较慢?