是内存泄漏?为什么 java.lang.ref.Finalizer 占用这么多内存

新手上路,请多包涵

我在我的程序上运行了堆转储。在内存分析器工具中打开,发现 java.lang.ref.Finalizer for org.logicalcobwebs.proxool.ProxyStatement 占用了大量内存。为什么会这样?

截屏

原文由 fuyou001 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

一些类实现了 Object.finalize() 方法。覆盖此方法的对象需要由后台线程调用终结器调用,并且在这种情况发生之前无法清除它们。如果这些任务很短并且您不丢弃其中的许多任务,那么一切都会很好。但是,如果您正在创建大量此类对象和/或它们的终结器需要很长时间,那么要终结的对象队列就会增加。这个队列有可能用完所有内存。

解决办法是

  • 尽可能不要使用 finalize()d 对象(如果你正在为对象编写类)
  • 使 finalize 非常短(如果你必须使用它)
  • 不要每次都丢弃此类对象(尝试重新使用它们)

最后一个选项可能最适合您,因为您正在使用现有的库。

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 3.0 许可协议

据我所知,Proxool 是用于 JDBC 连接的连接池。这向我表明问题是您的应用程序滥用了连接池。您的代码可能正在删除它们和/或其父连接,而不是在语句对象上调用 close 。 Proxool 依靠终结器来关闭底层驱动程序实现的对象……但这需要那些终结器实例。这也可能意味着您导致连接比必要更频繁地打开/关闭(真实的)数据库连接,这对性能不利。

所以我建议您检查您的代码是否存在泄漏的 ResultSet、Statement 和/或 Connection 对象,并确保在 finally 块中关闭它们。


查看内存转储,我希望您关心 898,527,228 字节的去向。绝大多数由 ID 为 2aab07855e38 的 Finalizer 对象保留。如果您还有转储文件,请查看 Finalizer 的是什么。它看起来比 Proxool 对象更有问题。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏