我想分享一个奇怪的例子。在生产中,我们的应用程序抛出 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 配置运行?对于负载较重的应用程序,推荐的配置是什么?
提前致谢