【发布时间】:2023-03-12 10:34:01
【问题描述】:
我的应用程序使用了第三方库(JTDS 驱动程序),其中包含一些覆盖 finalize() 方法的对象。我认为他们遵守关于何时不使用finalize() 的所有规则——这不取决于他们是否及时运行或根本不使用。
问题是它们的对象永远不会被释放。他们似乎被困在终结器队列中并且从未被删除。它们在几周内慢慢建立起来,并在堆空间之外运行 JVM。线程转储显示终结器线程只是在等待调用 finalize() 的东西。如果我调用System.runFinalization(),对象将被终结并从终结器队列中正确删除(并且不再出现在堆转储中)。
为什么System.runFinalization() 会正确删除对象,但终结器线程不会自己完成?
【问题讨论】:
-
我看不出有人如何重现您的问题以帮助您。
-
你在启动时向 JVM 传递了哪些参数?
-
除非你有这些 finalize 方法的代码可用,否则你怎么指望有人帮忙呢?
-
我真的只是希望有人对 Finalizer 的一般行为发表评论,而不一定要重现该问题。也许有人在他们的类(或者在我的情况下是第三方类)中看到了类似的问题,这些类覆盖了 finalize()。
-
描述终结器的行为实际上非常简单:“不可预测”;) 你真的应该向库作者报告这个错误
标签: java garbage-collection finalizer