Я хочу поделиться странным примером. При производстве наше приложение бросает исключение 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
попробуйте установить эти параметры –