2009-04-03 12 views
4

Мы используем довольно сложное приложение в качестве портлета на Websphere Portal Server 5.1 в AIX с использованием IBM JDK 1.4.2. В нашей производственной системе я вижу странное поведение в подробных журналах GC. После периода нормального поведения система может быстро начать выделение больших и больших блоков. Система запускает трассировку> 1000 мс для завершения каждого GC, но блоки выделяются так быстро, что существует только разрыв в 30 мс между отказами распределения.Поведение странного поведения мусора с сервером портала Websphere

  • Каждый отказ распределения немного больше последнего на некоторое целое количество x 1024 байта. Например. у вас может быть 5 МБ, а затем через короткое время 5 МБ + 17 * 1024.
  • Это может продолжаться до 10 минут.
  • Блоки, как правило, растут от 8 до 14 МБ, прежде чем они остановятся.
  • Это четырехъядерная система, и я полагаю, что сейчас она тратит> 95% времени на выполнение GC с тремя ядрами, ожидая, что другое ядро ​​завершит GC. В течение 10 минут. Уч.
  • Очевидно, что производительность системы умирает в этот момент.
  • У нас есть JSF, hibernate & JDBC, вызовы веб-сервисов, выход log4j и не намного больше.

Я интерпретирую это как скорее как нечто инфраструктурное, а не как наш код приложения. Если бы это была плохая конкатенация строк внутри цикла, мы ожидали бы более нерегулярного роста, чем блоки с 1024. Если бы это был рост StringBuffer или ArrayList, мы бы увидели удвоение размеров блоков. Рост заставляет меня думать о буферизации журналов или о чем-то еще. Я не могу придумать что-либо в нашем приложении, что распределения даже 1 МБ, не говоря уже о 14. Сегодня я искал записи в резервную копию в памяти до того, как их сбросили на диск, но объем протоколирующих заявлений за этот период обхода ГК был нигде не близок диапазон MB.

Очевидно, проблема связана с избыточным распределением памяти, а не с сборкой мусора, которая только делает все возможное, чтобы не отставать. Что-то выделяет большой блок и пытается увеличить его неэффективно с приращениями, которые слишком малы.

Любые идеи, которые могут вызывать все это, когда система находится под нагрузкой? Кто-нибудь видел что-то подобное с Portal Server?

Примечание: для кого-то, кто заинтересован, он начинает выглядеть так, как причина - случайный, но огромный запрос к базе данных. Кажется, что виновником является либо Hibernate, либо драйвер JDBC.

ответ

1

В зависимости от конкретной версии IBM JDK, которую вы используете, существуют различные варианты отслеживания «больших распределений». Различия в основном связаны с реализацией, и результатом является трассировка стека протоколирования в Java при распределении по определенному размеру (что должно помочь вам отслеживать виновника).

"Sovereign" 1.4.2 SR4 +: http://www-01.ibm.com/support/docview.wss?uid=swg21236523

"J9" 1.4.2 (если Java работает под опцией -Xj9): Вы должны раздобыть агента JVMPI/JVMTI для того же цель, я не могу найти ссылку для этого прямо сейчас.

+0

Обратите внимание, что в последних версиях IBM Java 5 и 6 теперь есть агент дампа, который вы можете использовать. Опция: -Xdump: stack: events = allocation, filter = # . может быть прямым размером, например «5 м» или диапазоном «256k..512k». Не забывайте, что «#» перед этим! Подробнее см. Руководство по диагностике Java. –

2

Не уверен, что может вызвать проблему, но вот идея о том, как исследовать больше: IBM JDK замечательный, потому что он может быть настроен на создание дампа кучи, когда он получает сигнал SIGQUIT.
В предыдущем проекте это был не наш JDK, но мы использовали его всякий раз, когда у нас были проблемы с памятью, чтобы исследовать.

Вот как включить heapdump: http://publib.boulder.ibm.com/infocenter/javasdk/v1r4m2/index.jsp?topic=/com.ibm.java.doc.diagnostics.142j9/html/enabling_a_heapdump.html

Тогда есть инструмент под названием heaproot, что позволит вам увидеть, что в этих свалках.

Поиск типа объектов должен привести вас к виновнику.

+0

Если вы собираете heapdump, то вы можете сделать хуже, чем использовать http://eclipse.org/mat для анализа файла. Если вы устанавливаете плагин читателя IBM DTFJ heapdump, он обеспечивает действительно хороший интерфейс для просмотра больших объектов в вашей куче. –

0

Только подсказка ... как только у нас был проект, который подвергся серьезным проблемам с GC (Websphere и IBM JDK) из-за фрагментации кучи. В конце мы добавили JDK-переключатель для принудительного уплотнения кучи.

Sun JDK не имеет фрагментарной кучи, но IBM JDK делает это из-за различной обработки памяти/GC.

Просто попробуй ... Я не могу вспомнить волшебный переключатель.

+0

http://www.ibm.com/developerworks/ibm/library/i-incrcomp/ – trunkc