Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как поймать утечку памяти


Автор: kkorsakoff 7.11.2007, 14:00
Есть подозрение на утечку памяти.

С такими задачами ни разу не сталкивался, поэтому прошу вашего совета: с чего начать, где и как искать.

Какими пользоваться инструментами (желательно бесплатными)?

Честно говоря слабо представляю, как вообще утечку можно обнаружить smile 

Автор: v2v 7.11.2007, 14:21
Понятие Сброщик Мусора тебе на знакомо? Вот начни со знакомства с ним. Он быстро упразднит твои подозрения  smile

Автор: kkorsakoff 7.11.2007, 17:20
Конечно знакомо. И что с ним делать. Просто система рабочая, не имею возможности перебирать все имеющиеся варианты параметров.
С чего начать хотя бы думать, чтобы не бездумно ковырять

Автор: Maksym 7.11.2007, 17:30
kkorsakoff
Начать можно с того, что добавить в командную строку запуска твоего приложения опцию -verbose:gc и посмотреть как расходуется и чиститься память по мере работы с приложением (запуск разных операций, подключение пользователей, соединение с внешними ресурсами.. в зависимости от специфики).

Добавлено через 3 минуты и 1 секунду
Еще есть очень неплохая и недлинная http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html, с теорией и конкретными рекомендациями.

Автор: v2v 7.11.2007, 17:34
с классификации проблемы.
Вы решили что происходит утечка памяти, почему? Засоряется оперативка? Память не освобождается после выхода из системы? 
ява убирает за собой весь мусор сама, так что это либо проблемы виртуальной машины (пишите в Sun) либо на самом деле дело в другом...

Автор: Royan 7.11.2007, 18:14
kkorsakoff, и все присутствующие. Надеюсь никто не питает иллюзий того что в Java утечка памяти невозможна. 
Что касается того как ее надо искать. Самый простой способ воспользоваться профилятором и посмотреть как расходуется память в зависимости от совершаемых действий. К сожалению, мне доводилось работать только с платным продуктом JProfiler. Скачать его можно вот отсюда http://www.ej-technologies.com/products/jprofiler/overview.html. Думаю там есть какой-то период бесплатного пользования программой, поэтому стоит попробовать.

Автор: Maksym 7.11.2007, 18:20
Цитата(Royan @  7.11.2007,  17:14 Найти цитируемый пост)
Надеюсь никто не питает иллюзий того что в Java утечка памяти невозможна. 

Этой крамольной мысли в топике, кажется не звучало. Быстро бы запинали  smile   smile 

Цитата(Royan @  7.11.2007,  17:14 Найти цитируемый пост)
Самый простой способ воспользоваться профилятором и посмотреть как расходуется память в зависимости от совершаемых действий.

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

Автор: kkorsakoff 7.11.2007, 21:11
Понаблюдал над коллектором.

Выяснилось, что из-за особенностей приложения (надеюсь все таки особенностей, а не утечекsmile) создавалось ОЧЕНЬ много короткоживущих объектов.
DefNew отрабатывал раз в секунду.
Увеличил NewSize до 32 - стало лучше, потом до 48.

Но все равно, нормально ли это, что каждые секунд 15-20 появляется около 40Мб мусора или все-таки искать грабли?

В приложении активно используется Hibernate, jniwrapper.

Нормально ли NewSize делать в 48/64 от всей памяти приложения?

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

Автор: Maksym 7.11.2007, 21:26
Цитата(kkorsakoff @  7.11.2007,  20:11 Найти цитируемый пост)
Но все равно, нормально ли это, что каждые секунд 15-20 появляется около 40Мб мусора

Зависит от того, что делает приложение. Ему есть что делать каждые 20 секунд? smile

Автор: kkorsakoff 7.11.2007, 23:18
Делать то есть что, обрабатывает телефонные вызовы. То есть ситуация вполне нормальная?

Автор: Maksym 7.11.2007, 23:24
kkorsakoff
На мой взгляд -- да. Главное, чтобы она освобождалась. Перед глазами пример web-приложения, в котором, при каждом клике пользователя в браузере (ну и соотвественно обработки несложного запроса на сервере), отъедается два-три метра. А пользователей и кликов много, тем ни менее коллектор практически мгновенно за ними подчищает.

Добавлено через 1 минуту и 40 секунд
В моей ситуации клиентам этого достаточно, предела памяти в реальных условиях мы никогда не достигаем. Просто посчитали и указали в документации при какой нагрузке мы гарантируем устойчивую работу системы. С запасом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)