Как справиться с утечками памяти в Java EE? - PullRequest
2 голосов
/ 19 июля 2011

Как я обнаружил где-то в сети, следующие пункты могут привести к утечке памяти. Например:

  • Объекты ResultSets и Statement
  • DataLists
  • Коллекция
  • Статические переменные и классы
  • Одиночки
  • HttpSession и HttpRequest

Управляемые bean-компоненты в моем JSF-приложении в основном @ViewScoped, поэтому я подумал, что после выхода из представления у GC достаточно информации для освобождения списков данных, объектов и т. Но это не имеет или не полностью:

enter image description here

Я просто закрываю сеансы гибернации вручную (используя finally), но это все. Остальное, что я ожидал от GC.

Не могли бы вы сказать мне,

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

Ответы [ 4 ]

2 голосов
/ 19 июля 2011

Мы в нашем проекте использовали профилировщик yourkit (http://www.yourkit.com/eap/index.jsp).Я нашел пользовательский интерфейс очень дружелюбным.

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

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

Не упустите:

  • Если у вас есть загруженная коллекция Java и с ней покончено, присвойте collectionObject=null.мы заметили, что хотя список вышел из области видимости, он не собирал мусор до тех пор, пока ему не было присвоено значение null.

  • Объекты, создаваемые в цикле.

  • объекты, на которые ссылаются классы.эти объекты обычно остаются в системе до тех пор, пока не будут освобождены все ссылки.

  • Объединение строк (String a = b+s) очень и очень дорого!

  • Перегрузка сеанса HTTP

1 голос
/ 19 июля 2011

JHat, Eclipse MAT может быть полезным. Даже JConsole дает достаточно подсказок о утечках памяти - или, по крайней мере, о том, что забирает всю вашу память.

1 голос
/ 19 июля 2011

Прежде всего, ИМХО, это НЕ настоящая утечка памяти. GC выпускает память время от времени. Может быть, вы должны показать нам отчет за более длительное время. Может быть, что-то держит объекты слишком долго. Чтобы посмотреть ссылки, вы можете использовать JProfiler как здесь . Попробуйте Eclipse Memory Analyzer автоматические отчеты тоже. Я думаю, вам стоит попробовать настроить сборщик мусора . И для обнаружения утечки памяти посмотрите на этот ответ Как найти утечку памяти Java

1 голос
/ 19 июля 2011

Вы должны использовать один из доступных профилировщиков Java. Много. Все профилировщики позволяют хранить снимки и сравнивать снимки. Таким образом, вы должны сохранить снимок в начале, затем выполнить сценарий с вашим приложением, затем снова сохранить снимок и сравнить. Вы получите все объекты, которые не могут быть удалены GC, и их ссылки. Затем попробуйте проанализировать, кто хранит ссылки на эти объекты и как исправить ошибку.

...