我想分享一個奇怪的例子。在生產我們的應用程序拋出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