Hibernate中c3p0中可能存在内存泄漏?

Posted

技术标签:

【中文标题】Hibernate中c3p0中可能存在内存泄漏?【英文标题】:Possible memory leak in c3p0 in Hibernate? 【发布时间】:2016-03-05 19:02:31 【问题描述】:

我们使用 c3p0 作为 Hibernate 中的池化库,配置如下。我们怀疑这个库中可能存在内存泄漏。我们转储应用程序的内存堆,它显示一个类型为“com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache”的对象使用 2.2GB 内存(占所有内存的 61.6%),并且它继续增长直到内存耗尽。据我了解,此类用于缓存 PreparedStatements。我们的配置使用 100 作为这个值,这意味着最多应该缓存 100 条语句。

configuration
    .setProperty("hibernate.c3p0.max_size", "25")
    .setProperty("hibernate.c3p0.min_size", "2")
    .setProperty("hibernate.c3p0.initial_pool_size", "2")
    .setProperty("hibernate.c3p0.timeout", "3600")
    .setProperty("hibernate.c3p0.max_statements", "100")
    .setProperty("hibernate.c3p0.idle_test_period", "300")
    .setProperty("hibernate.c3p0.acquire_increment", "2")
    .setProperty("hibernate.c3p0.maxConnectionAge", "3600")
    .setProperty("hibernate.c3p0.numHelperThreads", "6")

提前感谢您的帮助!

【问题讨论】:

嗨。几个简单的问题:1)你使用的是什么版本的c3p0? 2) 你可以通过 JMX 监控你的应用程序吗? c3p0 报告有关其语句缓存的大量信息,这些信息可能会有所帮助; 3) 你使用的是什么 dbms/jdbc 驱动程序?谢谢! 【参考方案1】:

是的,它确实可能是一个错误。我建议报告您的问题here。

三个提示:

    语句缓存在 c3p0 中默认禁用。我想你可以猜到原因。 c3p0 太容易配置错误。 c3p0 是一个(相当)成熟的库,但不幸的是,它也远不是当今 JDBC 连接池的最佳选择。我真的建议您尝试更快更可靠的HikariCP。

在我看来,HikariCP 也比 c3p0 更易于预测和使用。当然,您还可以使用其他连接池库:DBCP、Tomcat 池、BoneCP、Proxool 等。您可以尝试其中一些并选择适合您应用的。

所以基本上你有两个选择,关闭 c3p0 中的 JDBC 语句缓存并等待修复(或独立修复并创建 Pull Request)或尝试其他方法。

【讨论】:

默认情况下不启用语句缓存是直接出自使用 maxStatements 参数配置的透明语句池的 JDBC 3 规范,无论您建议什么。 感谢您的回答!我对关闭它的唯一担心是性能下降。尽管 c3p0 文档建议为缓存用户分析应用程序。也感谢您的链接。我在这里发布了一个问题:github.com/swaldman/c3p0/issues/61 @SteveWaldman 抱歉,我不知道。感谢您的提示。 我终于禁用了语句缓存并且内存泄漏问题消失了。通过禁用缓存,我没有发现任何性能问题。

以上是关于Hibernate中c3p0中可能存在内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

你的程序中可能存在内存泄漏(收藏!)

Hibernate/c3p0 连接泄漏

JDBC 大容量复制中可能存在内存泄漏

Java 应用程序中加载的类数中可能存在内存泄漏

一个线程内存泄漏问题定位过程

一个线程内存泄漏问题定位过程