由于几乎没有保证什么时候,甚至终结器运行和终结器几乎被认为是现在的气味 - 有没有办法说服JVM完全跳过所有的终结过程?
我问,因为我们有一个庞大的应用程序,当移动到一个较新的JVM(不确定在这个阶段)是什么看起来非常像终结者的已知问题(抛出异常,因此非常慢的GC) .
添加
有关Java内存泄漏故障排除的讨论:终结?建议在终结器中抛出异常时出现主要问题,因为这会大大减慢终结过程.
当内存变低并且堆转储分析显示大量Finalizer
对象(超过10,000,000)时,我的问题显示为急剧减速- 向我建议减速可能是他们的错,因为他们正在推迟GC.显然我可能是错的.
我没有权力要求重构.
有没有办法说服JVM完全跳过所有的终结过程?
一句话
但除非您的大部分对象都有finalize
方法和/或finalize
方法特别昂贵,否则我认为它们不太可能使GC"非常慢".我希望问题不是别的.
我建议您打开GC日志记录,尝试更好地了解实际情况.
但我也同意,finalize()
从长远来看,重构代码以摆脱这些方法可能是一件好事.(极少数情况下,使用finalize
真正是最佳解决方案.)
更新 - 你的新证据非常有说服力,但不是证明!
我没有权力要求重构.
然后,我建议你把证据放在那些做的人脚下:-).
或者,您可以向可疑finalize
方法添加异常处理程序,以查看它们是否抛出异常.(如果是,那么改变它们以避免抛出异常......)
但最重要的是,如果最终确定是您的性能问题的真正原因,那么最好(也可能是唯一)治愈它们的方法是更改代码.