奇妙な例を共有したいと思います。本番環境では、アプリケーションが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」の1つのインスタンスは、72 970 824(57,75%)バイトを占有します。メモリは、「org.apache.catalina.loader.WebappClassLoader@0x82f1c58」によってロードされた「com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache」の1つのインスタンスに蓄積されます。
アドバイスしてください:-このインスタンスがそのような巨大なメモリを使用する理由は何ですか?正しいc3p0構成で実行していますか?負荷の高いアプリケーションに推奨される構成は何ですか?
前もって感謝します