【发布时间】:2012-07-16 03:39:52
【问题描述】:
我想分享一个奇怪的例子。在生产中,我们的应用程序抛出 OOM 异常,我们进行了堆转储并开始分析,后来我们发现 com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache 实例存在问题。该对象的大小约为堆大小的 50%。该应用程序正在与数十亿用户一起运行,并且服务器一次又一次地停机。
此应用程序在 tomcat 上运行,其中 tomcat 连接器允许最大 300 个并发请求,以下是 c3p0 配置。
jdbc.hibernate.c3p0.minPoolSize=2
jdbc.hibernate.c3p0.maxPoolSize=150
jdbc.hibernate.c3p0.maxIdleTime=0
jdbc.hibernate.c3p0.maxStatementsPerConnection=50
jdbc.hibernate.c3p0.numHelperThreads=6
从堆监控工具我们收到以下消息
“org.apache.catalina.loader.WebappClassLoader @ 0x82f1c58”加载的“com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache”实例占用 72 970 824 (57,75%) 个字节。内存在“org.apache.catalina.loader.WebappClassLoader @ 0x82f1c58”加载的“com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache”的一个实例中累积
请指教:- 这个实例占用如此大内存的原因是什么? 我们是否使用正确的 c3p0 配置运行? 对于负载较重的应用程序,推荐的配置是什么?
提前致谢
【问题讨论】:
-
您说您使用的是Tomcat。那你为什么要使用自己的 C3P0 而不是 Tomcat 的连接池?
-
尝试设置这些参数