Подтвердить что ты не робот

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

Мы иногда сталкиваемся с ошибками памяти на нашем сервере приложений. Мы видим, что используемый размер кучи постепенно увеличивается, пока, наконец, не достигнет доступной кучи в размере. Это происходит каждые 3 недели, после чего для его исправления требуется перезагрузка сервера. При анализе дампов кучи мы рассматриваем проблему как объекты, используемые в JSP.

Могут ли объекты JSP быть реальной причиной проблем с памятью Appserver? Как мы освобождаем объекты JSP (объекты, которые создаются с использованием usebean или других тегов)?

У нас есть кластерный сервер приложений Websphere с двумя узлами и IHS.

EDIT: приведенные выше результаты основаны на приведенном ниже анализе журнала кучи-дампа и nativestderr с использованием помощника поддержки IBM

nativestd анализ журнала ошибок:

alt text http://saregos.com/wp-content/uploads/2010/03/chart.jpg

Анализ дампа кучи:

! [alt text] [2]

Анализ дампа кучи, показывающий непосредственные доминанты (2 уровня вверх по hastable записи в изображении выше)

! [alt text] [3]

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

EDIT2: дополнительная информация доступна по адресу http://saregos.com/?p=43

4b9b3361

Ответ 1

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

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

Ответ 2

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

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. Анализ heapdump показывает, что следующие объекты занимают все больше места:

40 543 128 [304] 47 класс

com/ibm/wsspi/rasdiag/DiagnosticConfigHome 40 539 056 [56] 2 java/util/Hashtable 0xa8089170 40 539 000 [2 064] 511 массив java/util/Hashtable $ Entry 6 300 888 [40] 3 java/util/Hashtable $ HashntryCache

Ответ 3

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

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

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

Ответ 4

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

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

  • не правильно написанный код - решение состоит в том, чтобы написать его правильно, чтобы он не потреблял больше, чем нужно - эффективная Java поможет здесь.
  • приложение просто нуждается в такой большой памяти. Затем вы должны увеличить память VM с помощью Xmx, Xms, XX:MaxHeapSize,...

Ответ 5

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

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

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

EDIT: проверка неизданных статических ресурсов, о которых упоминает Даниил, - это еще одна полезная вещь:)

Ответ 6

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