我想分享一个奇怪的例子。在生产我们的应用程序抛出OOM异常,我们采取了堆转储,并开始分析,后来我们发现与com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache实例的问题。该对象的大小约为堆大小的50%。该应用程序正在运行数十亿用户和服务器一次又一次地下降。c3p0缓存对象的性能问题:
此应用程序在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
从堆监视工具我们得到以下信息:“com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache”的
一个实例通过“org.apache.catalina.loader.WebappClassLoader @装0x82f1c58“占用72 970 824(57,75%)字节。存储累积在“com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache”的一个实例被加载“org.apache.catalina.loader.WebappClassLoader @ 0x82f1c58”
请请告知: - 可以采取什么原因这个实例占用如此巨大的内存? 我们是否正确运行正确的c3p0配置? 重载应用程序的推荐配置是什么?
在此先感谢
你说你正在使用Tomcat。为什么你使用自己的C3P0而不是Tomcat的连接池? – jpkrohling 2012-07-17 08:34:09
尝试设置这些参数 –
2012-07-17 08:39:22