| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Как поймать утечку памяти |
| Автор: kkorsakoff 7.11.2007, 14:00 |
| Есть подозрение на утечку памяти. С такими задачами ни разу не сталкивался, поэтому прошу вашего совета: с чего начать, где и как искать. Какими пользоваться инструментами (желательно бесплатными)? Честно говоря слабо представляю, как вообще утечку можно обнаружить |
| Автор: v2v 7.11.2007, 14:21 |
| Понятие Сброщик Мусора тебе на знакомо? Вот начни со знакомства с ним. Он быстро упразднит твои подозрения |
| Автор: 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. Думаю там есть какой-то период бесплатного пользования программой, поэтому стоит попробовать. |
| Автор: kkorsakoff 7.11.2007, 21:11 |
| Понаблюдал над коллектором. Выяснилось, что из-за особенностей приложения (надеюсь все таки особенностей, а не утечек DefNew отрабатывал раз в секунду. Увеличил NewSize до 32 - стало лучше, потом до 48. Но все равно, нормально ли это, что каждые секунд 15-20 появляется около 40Мб мусора или все-таки искать грабли? В приложении активно используется Hibernate, jniwrapper. Нормально ли NewSize делать в 48/64 от всей памяти приложения? Добавлено через 4 минуты и 21 секунду Да, и можно ли с помощью профайлера узнать, под что используются эти мегабайты памяти. Хотя бы какие классы... Давно бы сам попробовал, да найти бы бесплатный. |
| Автор: Maksym 7.11.2007, 21:26 | ||
Зависит от того, что делает приложение. Ему есть что делать каждые 20 секунд? |
| Автор: kkorsakoff 7.11.2007, 23:18 |
| Делать то есть что, обрабатывает телефонные вызовы. То есть ситуация вполне нормальная? |
| Автор: Maksym 7.11.2007, 23:24 |
| kkorsakoff На мой взгляд -- да. Главное, чтобы она освобождалась. Перед глазами пример web-приложения, в котором, при каждом клике пользователя в браузере (ну и соотвественно обработки несложного запроса на сервере), отъедается два-три метра. А пользователей и кликов много, тем ни менее коллектор практически мгновенно за ними подчищает. Добавлено через 1 минуту и 40 секунд В моей ситуации клиентам этого достаточно, предела памяти в реальных условиях мы никогда не достигаем. Просто посчитали и указали в документации при какой нагрузке мы гарантируем устойчивую работу системы. С запасом. |