Сервер Sun Web 7, обслуживающий .jsp - поведение пространства Eden - возможная утечка памяти - PullRequest
1 голос
/ 04 августа 2011

Моя компания недавно переехала в Alfresco как решение для управления контентом. Поскольку часть содержимого является динамической (файл .jsp, включенный в другой файл .jsp, читает карту сайта, опубликованную в формате XML от Alfresco. и кэширует результат в течение 24 часов) сгенерированные файлы имеют формат .jsp и rsync 'и обслуживаются из нашего контейнера сервлетов Sun Web Server 7.

Каждая страница имеет заголовок, меню и нижний колонтитул, который включен используя директиву jsp:include. Насколько я понимаю, когда первый запрос будет сделан на index.jsp, будет несколько скомпилированных jsps, например index.class, header.class, menu.class и footer.class. Требуется, чтобы они компилировались один раз, а контейнер сервлетов проверял на предмет изменения любой из исходных jsps (выдвигаемых Alfresco) каждые x секунд.

Сам веб-сервер настроен (default-web.xml) для готовности к работе со следующими параметрами в соответствии с рекомендациями Sun docs:

<init-param>
  <param-name>development</param-name>
  <param-value>false</param-value>
</init-param>
<init-param>
  <param-name>checkInterval</param-name>
  <param-value>0</param-value>
</init-param>   
  <init-param>
  <param-name>fork</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
  <param-name>mappedfile</param-name>
  <param-value>false</param-value>
</init-param>
<init-param>
  <param-name>suppressSmap</param-name>
  <param-value>true</param-value>
</init-param>
<init-param>
  <param-name>classdebuginfo</param-name>
  <param-value>false</param-value>
</init-param>
<init-param>
  <param-name>trimSpaces</param-name>
  <param-value>true</param-value>
</init-param>

Обратите внимание, что для параметра checkInterval должно быть установлено значение 60, но это приводит к тому, что веб-сервер не запускается (я не смог выяснить, почему). Неудачный обходной путь для этого затем установить development в true, чего я бы хотел избежать.

Контейнер сервлета сконфигурирован со следующими настройками JVM (опять же, как рекомендовано Sun docs):

-server -Xrs -Xmx2048m -Xms2048m -Xmn2024m -XX:+AggressiveHeap -XX:LargePageSizeInBytes=256m -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+DisableExplicitGC

Во время тестирования производительности мы видим, что пространство Eden часто увеличивается до 2 ГБ (общий размер нашего статического содержимого составляет примерно 200 МБ, а наш тестирование против нескольких страниц). Результаты во многих второстепенных коллекциях; быстрое выталкивание объектов в постоянное пространство, и оно никогда не восстанавливается, что приводит к частым частичным сборкам мусора (Пространство оставшихся в живых также уменьшается с 90 Мб до 2 байтов, и я могу только предположить, что пространство Идена претендует на его собственное - кто-нибудь может подтвердить?). Это наш самый большой вопросительный знак; никто из наших разработчиков думаю, что это нормальное поведение, но мы не можем объяснить, куда уходит эта память.

Snapshot of Eden space under load

Другая проблема, с которой мы сталкиваемся, - это количество потоков. С каждым запросом http, приводящим к созданию нового потока в сервлете, я ожидаю, что он будет расти пропорционально нагрузке (я также думаю, что создается новый поток также внутри каждого сервлета при выполнении jsp:include во время выполнения (RequestDispatcher.include() в скомпилированном родительском jsp). Однако после того, как каждый запрос обслужен, поток должен умереть, и на его месте появляется новый. Это правильное предположение? Кажется, что количество потоков останавливается и растет независимо от нагрузки.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 04 августа 2011

Пилообразная схема на графике использования кучи является нормальной и не указывает на утечку памяти.Утечка памяти указывается только в том случае, если нижняя граница пилообразного устройства со временем имеет тенденцию к росту.

Тем не менее, всегда следует выполнять полные ГХ, что может указывать на утечку памяти.Попробуйте запустить с профилировщиком памяти, чтобы увидеть, если вы можете определить, что протекает.

У меня такое ощущение, что я знаю, что может быть причиной утечки.Я думаю, что вы сказали, что вы динамически генерируете JSP.Каждый раз, когда контейнер находит новый (или обновленный) JSP, он генерирует классы Java, компилирует классы и затем загружает байт-коды.Если вы не будете осторожны, старые классы / старые версии классов останутся доступными и утечек.


Я бы также не ожидал, что число потоков будет расти и падать с нагрузкой.Приличный веб-контейнер будет поддерживать пул потоков, которые используются для обработки входящих запросов.Пул потоков обычно имеет фиксированную верхнюю границу, так что поток запросов не приводит к взрыву количества потоков, что приводит к проблемам использования ресурсов и конфликтам.

...