由于无法保证终结器何时运行以及是否会运行,而且如今终结器几乎被认为是一种气味 - 有什么方法可以说服 JVM 完全跳过所有终结过程吗?
我问这个问题是因为我们有一个庞大的应用程序,当它迁移到较新的 JVM(现阶段不确定是哪个)时,它会因为看起来非常类似于终结器的已知问题而崩溃(抛出异常,因此 GC 非常慢) 。
Added
有一些讨论java 内存泄漏故障排除:终结? https://stackoverflow.com/q/7644556/823393其中建议主要问题是在终结器中抛出异常时出现的,因为这会大大减慢终结过程。
当内存变低并且堆转储分析显示大量内存时,我的问题显示速度显着减慢Finalizer
对象(超过 10,000,000) - 对我来说,速度减慢可能是他们的错,因为他们延迟了 GC。显然我可能是错的。
我没有权力要求重构。
有什么方法可以说服 JVM 完全跳过所有终结过程吗?
一句话说不。
但除非你的大部分对象都有finalize
方法和/或finalize
方法特别昂贵,我认为它们不太可能使 GC“非常慢”。我预计问题是别的。
我建议您打开 GC 日志记录以尝试更好地了解实际发生的情况。
但我也同意,重构代码以摆脱finalize()
从长远来看,方法可能是一件好事。 (极少数情况下使用finalize
确实是最好的解决方案。)
UPDATE- 你的新证据非常有说服力,尽管不是证据!
我没有权力要求重构。
然后,我建议您将证据放在这样做的人的脚下:-)。
或者,您可以向嫌疑人添加异常处理程序finalize
方法来看看它们是否are抛出异常。 (如果是,则更改它们以避免抛出异常......)
但底线是,如果终结是性能问题的真正原因,那么解决这些问题的最佳(也可能是唯一)方法就是更改代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)