Мы сталкивались Из Ошибок памяти в нашем Сервере приложений для когда-то. Мы видим, что используемый размер "кучи" постепенно увеличивается до наконец, он достигает доступной "кучи" в размере. Это происходит каждые 3 недели, после которого перезапуск сервера необходим для фиксации этого. После анализа дампов "кучи" мы находим, что проблема объекты, используемые в JSPs.
Объекты JSP могут быть реальной причиной проблем памяти Appserver? Как мы освобождаем объекты JSP (Объекты, которые инстанцируют с помощью usebean или другие теги)?
У нас есть кластеризованный Websphere appserver с 2 узлами и IHS.
Править: Результаты выше основаны на дампе "кучи" и анализе журнала nativestderr, данном ниже использования помощника поддержки IBM
nativestd допускают ошибку анализ журнала:
сопроводительный текст http://saregos.com/wp-content/uploads/2010/03/chart.jpg
Анализ дампа "кучи":
! [сопроводительный текст] [2]
Анализ дампа "кучи", показывающий непосредственным доминаторам (2 выравнивает hastable записи в изображении выше),
! [сопроводительный текст] [3]
Последнее изображение показывает, что непосредственные доминаторы являются на самом деле объектами, используемыми в JSPs.
EDIT2: Больше информации, доступной по http://saregos.com/?p=43
Запуск сборки мусора вручную не решит вашу проблему - он не освободит ресурсы, которые все еще используются.
Для поиска утечек следует использовать инструмент профилирования (например, jProfiler). Вы, вероятно, используете код, который хранит ссылки в списках или картах, которые не выпускаются во время выполнения - возможно, статические ссылки.
Нет никаких особых требований к освобождению объектов, выделенных в JSP, по крайней мере, как насколько я знаю. Вместо того, чтобы исследовать такие варианты, я лучше сосредоточусь на поиске реальной проблемы в кодах вашего приложения и ее устранении.
Некоторые подсказки, которые могут помочь:
РЕДАКТИРОВАТЬ: еще одна стоящая вещь :)
Если вы работаете под управлением Sun 6 JVM, настоятельно рекомендуется использовать программу jvisualvm в JDK, чтобы получить начальный обзор того, что на самом деле происходит внутри программы. Сравнение снимков действительно хорошо помогает понять, какие объекты прокрадываются внутрь.
Если Sun 6 JVM не является вариантом, тогда изучите, какие инструменты профилирования у вас есть. Испытания могут завести вас очень далеко.
Это может быть что-то настолько простое, как гигантские символьные массивы, лежащие в основе подстроки, которую вы собираете в список, например, для ведения домашнего хозяйства.
Советую прочитать Effective Java, глава 2. Следуя ей, вместе с профилировщиком вы сможете определить места, где ваше приложение производит утечки памяти.
Освобождение памяти не является способом решения проблемы обширного потребления памяти. Большое потребление памяти может быть результатом двух вещей:
Xmx
, Xms
, XX:MaxHeapSize
,... Сначала я бы прикрепил инструмент профиля, чтобы рассказать вам, что это за «объекты», которые занимают всю память.
Eclipse имеет TPTP, или есть JProfiler или JProbe.
Любой из них должен показать, что куча объектов увеличилась, и позволить вам изучить ее, чтобы увидеть, что находится в куче.
Затем найдите в базе кода, кто их создает.
Возможно, у вас есть кэш или объект дерева / карты с элементами, и вы реализовали только метод «equals ()» для этих объектов, и вам нужно реализовать «hashcode ()». Это могло бы затем карта / кеш / дерево будут становиться все больше и больше, пока не упадут. Это только предположение.
JProfiler будет моим первым звонком
В Javaworld есть пример снимка экрана того, что находится в памяти ...
(источник: javaworld.com )
И снимок экрана объекта накопление и очистка кучи (отсюда и кромка пилы)
(источник: javaworld.com )
ОБНОВЛЕНИЕ ***************** *******************************
Хорошо, я бы посмотрел на ...
http: //www-01.ibm.com/support/docview.wss?uid=swg1PK38940
Использование кучи со временем увеличивается, что приводит к состоянию OutOfMemory . Анализ кучи показывает, что следующие объекты занимают все больше места:
40 543 128 [304] 47 class
com / ibm / wsspi / rasdiag / DiagnosticConfigHome 40 539 056 [56] 2 java / util / Hashtable 0xa8089170 40 539 000 [2064] 511 массив java / util / Hashtable $ Entry 6 300 888 [40] 3 java / util / Hashtable $ HashtableCacheHashEntry
{ {1}}Как я понимаю, эти пожиратели памяти верхнего уровня - кэш-память и объекты, хранящиеся в ней. Возможно, вам следует убедиться, что ваш кэш будет освобождать объекты, когда они занимают слишком много памяти. Вы можете использовать weak-ref, если вам нужен кэш только для живых объектов.