首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是内存泄漏吗?为什么java.lang.ref.Finalizer占用这么多内存

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

Stack Overflow用户
提问于 2011-12-02 18:40:16
回答 2查看 56.3K关注 0票数 67

我在我的程序上运行了一个堆转储。当我在内存分析器工具中打开它时,我发现org.logicalcobwebs.proxool.ProxyStatementjava.lang.ref.Finalizer占用了大量内存。为何会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-02 18:47:42

有些类实现了Object.finalize()方法。覆盖此方法的对象需要由后台线程调用finalizer调用,并且在此之前无法清除这些对象。如果这些任务很短,并且您没有丢弃其中的许多任务,那么一切都会很好地工作。但是,如果您正在创建大量这样的对象,并且/或者它们的finalizer需要很长时间,那么待完成的对象队列就会累积起来。此队列可能会用完所有内存。

解决方案是

如果可以,请不要使用finalize()d objects (如果您正在为对象编写类)

  • make finalize very short (如果您必须使用它)

  • 不要每次都丢弃这样的对象(尝试重用它们)

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

票数 69
EN

Stack Overflow用户

发布于 2011-12-02 19:05:48

据我所知,Proxool是一个用于JDBC连接的连接池。在我看来,问题在于您的应用程序滥用了连接池。您的代码可能会删除语句对象和/或其父连接,而不是对语句对象调用close。Proxool依赖于终结器来关闭底层驱动程序实现的对象...但这需要这些Finalizer实例。这也可能意味着您正在导致连接打开/关闭(实际)数据库连接的频率比必要的更高,这将对性能造成不良影响。

因此,我建议您检查代码中是否有泄漏的ResultSet、语句和/或连接对象,并确保在finally块中关闭它们。

看一下内存转储,我希望您关心的是898,527,228字节的去向。绝大多数由id为2aab07855e38的终结器对象保留。如果您仍然拥有转储文件,请查看该Finalizer所引用的内容。它看起来比Proxool对象更有问题。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8355064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档