Как профилировать и понимать вывод для Java Web App - PullRequest
1 голос
/ 19 августа 2009

Я сейчас пытаюсь профилировать веб-приложение Java. Я использовал Netbeans Profiler в сочетании с Eclipse. Мой сервер (Tomcat) работает через плагин eclipse, и я динамически подключаюсь к серверу с помощью профилировщика Netbeans.

У меня есть основная проблема: через некоторое время серверу не хватает памяти в среде. Я прочитал об утечке памяти и понял, что есть два пути: 1. Большие объекты остаются в памяти, остаются незагруженными и вызывают утечку памяти ИЛИ 2. мелкие объекты продолжают присваиваться в памяти без сбора.

Хотя второе обычно трудно найти, один из обычных симптомов состоит в том, что в течение определенного периода времени вывоз мусора, вывозимого из жернов, будет увеличиваться, независимо от скорости. И, похоже, это происходит в моем веб-приложении, хотя в действительности никаких действий не происходит. Поколения увеличиваются с течением времени, неуклонно и без исключений. Заставить меня подумать, что у меня где-то есть объекты, на которые я должен был собрать мусор.

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

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

Я был бы признателен, если бы вы указали мне на некоторые реальные статьи и т. Д., Которые бы просветили меня, как понять смысл профилирования и что я должен делать, чтобы убедиться, что я поймаю виновника.

Любая помощь очень ценится.

Найдите прикрепленный скриншот. альтернативный текст http://dl.getdropbox.com/u/1264228/Files/State.png

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Лучший способ обнаружить утечку памяти в любом приложении (Java или нет) - это делать периодические снимки памяти во время использования приложения с последующим тщательным анализом количества объектов для различных типов управляемых объектов. по заявке.

Большинство утечек памяти можно отнести к группе объектов, которые показывают наибольшее увеличение потребления памяти. Вкратце, следует отдавать приоритет Δ MEM (объектам), а не Σ MEM (объектам).

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

Для быстрого ознакомления с тем, как это сделать с Netbeans, вы можете взглянуть на одно из руководств по Java Passion .

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

Наконец, следующий список терминов будет полезен, поскольку эффективный анализ требует знания их в качестве предварительных условий:

1 голос
/ 20 августа 2009

Я обычно беру пару раз в кучу каждые несколько секунд, чтобы посмотреть, что происходит, и что может торчать.

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

Не всегда легко пройти через сотни и тысячи объектов и интерпретировать происходящее. Я нашел этот курс на JavaPassion очень полезным для новичка.

...