JVM HeapDump: память накапливается в одном экземпляре «java.util.concurrent.ConcurrentHashMap $ Segment.

У меня проблемы с JVM-Heap.

У нас есть веб-сайт с HTTP-сервером Apache и сервером приложений Apache Tomcat.

Все запросы * .jsp к HTTP-серверу Apache будут перенаправлены на сервер Tomcat (протокол: ajp).

На сайте более 10'000 файлов jsp.

У нас также есть поисковое устройство Google, которое каждую ночь сканирует веб-сайт.

Во время сканирования объем кучи jvm увеличивается до максимального предела в 8 ГБ.

С помощью javamelody я вижу, что пространство кучи увеличивается аналогично загруженным классам.

Для анализа взял кучу свалки.

Вот отчет с Eclipse MAT:


Один экземпляр org.apache.jasper.servlet.JspServlet, загруженный с помощью org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148, занимает 1'189'603'328 (96,75%) байт.

Память накапливается в одном экземпляре "java.util.concurrent.ConcurrentHashMap $ Segment []", загруженном "".

Ключевые слова

java.util.concurrent.ConcurrentHashMap $ Segment []

org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148

org.apache.jasper.servlet.JspServlet


Есть ли проблема с запросами GSA?

И почему JVM не может выгружать сгенерированные классы?


person user1373150    schedule 03.05.2012    source источник
comment
Это показывает 1,1 ГБ используемой кучи. Это единственная основная часть, потребляющая память?   -  person Sean    schedule 03.05.2012
comment
Да, только один. Я вручную остановил GSA, чтобы получить дамп кучи, так что причина, почему она не очень велика. Еще на прошлой неделе брал, тогда было 3,8 Гб.   -  person user1373150    schedule 04.05.2012
comment
Я бы не стал останавливать GSA делать свалку кучи. Если вы это сделаете, некоторые ресурсы могут быть высвобождены, и тогда ваш дамп кучи не расскажет вам всю историю. Вы видите в своих журналах исключения нехватки памяти? В таком случае вы можете добавить параметр запуска HeapDumpOnOutOfMemoryError stackoverflow.com/q/542979/425406   -  person Sean    schedule 04.05.2012
comment
Это дамп кучи после OutOfMemoryError: один экземпляр org.apache.jasper.compiler.JspRuntimeContext, загруженный org.apache.catalina.loader.StandardClassLoader @ 0x7092af928, занимает 4'367'316'712 (98,57%) байт. Память накапливается в одном экземпляре java.util.concurrent.ConcurrentHashMap $ Segment [], загруженном ‹загрузчиком системных классов›. Ключевые слова java.util.concurrent.ConcurrentHashMap $ Segment [] org.apache.catalina.loader.StandardClassLoader @ 0x7092af928 org.apache.jasper.compiler.JspRuntimeContext   -  person user1373150    schedule 04.05.2012
comment
прочтите эту документацию, если вы еще не tomcat.apache. org / tomcat-6.0-doc / jasper-howto.html Это поможет вам настроить свой механизм jasper, чтобы, возможно, уменьшить площадь, которую это вызывает   -  person Sean    schedule 04.05.2012


Ответы (1)


Похоже, что загрузка всех JSP вызывает проблемы.

По умолчанию Tomcat сохраняет все загруженные JSP в памяти до остановки веб-приложения.

В Tomcat 7 вы можете установить параметр maxLoadedJsps сервлета JSP, чтобы ограничить количество JSP, хранящихся в памяти.

person Mark Thomas    schedule 03.05.2012
comment
Спасибо, есть ли решение для Tomcat 6? - person user1373150; 04.05.2012
comment
Еще нет. Бэк-порт этой функции застопорился из-за комбинации нескольких ошибок, которые необходимо было исправить, и отсутствия интереса. - person Mark Thomas; 04.05.2012