Как освободить память?

Мы сталкивались Из Ошибок памяти в нашем Сервере приложений для когда-то. Мы видим, что используемый размер "кучи" постепенно увеличивается до наконец, он достигает доступной "кучи" в размере. Это происходит каждые 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

17
задан sarego 6 April 2010 в 03:26
поделиться

6 ответов

Запуск сборки мусора вручную не решит вашу проблему - он не освободит ресурсы, которые все еще используются.

Для поиска утечек следует использовать инструмент профилирования (например, jProfiler). Вы, вероятно, используете код, который хранит ссылки в списках или картах, которые не выпускаются во время выполнения - возможно, статические ссылки.

7
ответ дан 30 November 2019 в 13:45
поделиться

Нет никаких особых требований к освобождению объектов, выделенных в JSP, по крайней мере, как насколько я знаю. Вместо того, чтобы исследовать такие варианты, я лучше сосредоточусь на поиске реальной проблемы в кодах вашего приложения и ее устранении.

Некоторые подсказки, которые могут помочь:

  • Проверьте объем ваших bean-компонентов. Разве ты не , например, сохранение чего-то конкретного пользователя или запроса в области "приложения" (по ошибке)?
  • Проверьте настройки тайм-аута веб-сеанса в веб-приложении и настройки сервера приложений .
  • Вы упомянули, что потребление кучи постепенно растет. Если это действительно так, попытайтесь увидеть, насколько увеличивается размер кучи при различных пользовательских сценариях: Возьмите кучу дампа, запустите тест, позвольте тайм-аут данных сеанса, возьмите другой дамп и сравните их. Это может дать вам некоторое представление о том, откуда берутся объекты в куче.
  • Обязательно проверьте bean-компоненты на наличие очевидных утечек памяти :)

РЕДАКТИРОВАТЬ: еще одна стоящая вещь :)

1
ответ дан 30 November 2019 в 13:45
поделиться

Если вы работаете под управлением Sun 6 JVM, настоятельно рекомендуется использовать программу jvisualvm в JDK, чтобы получить начальный обзор того, что на самом деле происходит внутри программы. Сравнение снимков действительно хорошо помогает понять, какие объекты прокрадываются внутрь.

Если Sun 6 JVM не является вариантом, тогда изучите, какие инструменты профилирования у вас есть. Испытания могут завести вас очень далеко.

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

2
ответ дан 30 November 2019 в 13:45
поделиться

Советую прочитать Effective Java, глава 2. Следуя ей, вместе с профилировщиком вы сможете определить места, где ваше приложение производит утечки памяти.

Освобождение памяти не является способом решения проблемы обширного потребления памяти. Большое потребление памяти может быть результатом двух вещей:

  • неправильно написанный код - решение состоит в том, чтобы написать его правильно, чтобы он не потреблял больше, чем нужно - здесь поможет эффективная Java.
  • приложению просто требуется столько памяти. Тогда вам следует увеличить память виртуальной машины, используя Xmx, Xms, XX:MaxHeapSize,...
2
ответ дан 30 November 2019 в 13:45
поделиться

Сначала я бы прикрепил инструмент профиля, чтобы рассказать вам, что это за «объекты», которые занимают всю память.

Eclipse имеет TPTP, или есть JProfiler или JProbe.

Любой из них должен показать, что куча объектов увеличилась, и позволить вам изучить ее, чтобы увидеть, что находится в куче.

Затем найдите в базе кода, кто их создает.

Возможно, у вас есть кэш или объект дерева / карты с элементами, и вы реализовали только метод «equals ()» для этих объектов, и вам нужно реализовать «hashcode ()». Это могло бы затем карта / кеш / дерево будут становиться все больше и больше, пока не упадут. Это только предположение.

JProfiler будет моим первым звонком

В Javaworld есть пример снимка экрана того, что находится в памяти ...

alt text
(источник: javaworld.com )

И снимок экрана объекта накопление и очистка кучи (отсюда и кромка пилы)

alt text
(источник: 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}}
8
ответ дан 30 November 2019 в 13:45
поделиться

Как я понимаю, эти пожиратели памяти верхнего уровня - кэш-память и объекты, хранящиеся в ней. Возможно, вам следует убедиться, что ваш кэш будет освобождать объекты, когда они занимают слишком много памяти. Вы можете использовать weak-ref, если вам нужен кэш только для живых объектов.

0
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: