использование Jvisualvm для обнаружения утечек памяти

Мой java jar — лишь один из многих, которые использует более крупная программа. Я пытаюсь определить, является ли мой код причиной утечки памяти или есть другие проблемы вне моего кода. Я использую jvisualvm и определил все свои классы, и ни один из них не кажется подозрительным. Глядя на сэмплер, я вижу, что byte[], char[] и int[] являются самыми популярными пользователями с точки зрения размера и созданных экземпляров. проблема в том, что я не могу определить, кому они принадлежат. Я знаю, что у меня есть разные байты [] в моей программе, но поскольку их около 32 000 экземпляров, трудно определить источник, просматривая их один за другим. Есть ли способ отфильтровать данные, чтобы можно было просматривать только элементы, происходящие из определенной банки или области? Спасибо.


person Jason    schedule 12.12.2012    source источник
comment
Я лично нашел MAT лучше для аналитической работы и легче видеть входящие/исходящие ссылки. Ты это пробовал? eclipse.org/mat   -  person BunjiquoBianco    schedule 12.12.2012
comment
Может ли он ссылаться на внешние JVM?   -  person Jason    schedule 12.12.2012
comment
MAT работает на дампах кучи. Как вы думаете, вы могли бы получить один?   -  person K Erlandsson    schedule 12.12.2012
comment
Если вы сделаете дамп кучи, вы сможете увидеть, где сохраняются объекты. VisualVM позволяет вам получить дамп кучи и загрузить его для анализа.   -  person Peter Lawrey    schedule 12.12.2012
comment
Дамп кучи? Я уверен, что JVisualVm позволяет мне сохранять дампы кучи. это сработает?   -  person Jason    schedule 12.12.2012
comment
@PeterLawrey - я считаю, что у меня проблемы с анализом. Я создал дамп кучи в visualvm и посмотрел сводку. Я нашел 40 самых больших объектов по сохраненному размеру. В списке есть пара byte[], но я до сих пор не могу проследить и определить класс, который его создал.   -  person Jason    schedule 12.12.2012
comment
Вы можете только видеть, почему они сохраняются, и это то, что вам нужно исправить, чтобы предотвратить утечку памяти. Я подозреваю, что VisualVM также не может сказать вам, где они были размещены.   -  person Peter Lawrey    schedule 12.12.2012
comment
Если вы не знаете, что создаете много экземпляров byte[] или String, я бы не стал ставить деньги на то, что byte[] или char[] являются источником проблемы. Сконцентрируйтесь на необычном количестве объектов, которые, как вы знаете, вы создаете, даже если они не самые большие в куче. Я думаю, что MAT сможет открывать дампы кучи из VisualVM - почти уверен, что VVM использует формат hprof.   -  person BunjiquoBianco    schedule 12.12.2012
comment
Я установил MAT в eclipse, но у меня нет возможности открыть дамп кучи. Мне придется потратить некоторое время, чтобы разобраться с этим.   -  person Jason    schedule 12.12.2012
comment
@BunjiquoBianco - я установил и проанализировал дампы кучи как мог. MAT определенно позволил лучше понять потенциал утечек памяти. Спасибо.   -  person Jason    schedule 12.12.2012
comment
@BunjiquoBianco - можете ли вы поместить свои комментарии в предлагаемый ответ, чтобы я мог его отметить?   -  person Jason    schedule 12.12.2012


Ответы (1)


Если вы не знаете, что создаете много экземпляров byte[] или String, я бы не стал ставить деньги на то, что byte[] или char[] являются источником проблемы. Почти в каждой куче, которую я перерыл, есть множество таких, поскольку они используются во многих частях внутренностей Java. Я не говорю, что они не могут быть проблемой, но полезнее сначала сконцентрироваться на необычном количестве объектов, которые, как вы знаете, вы создаете, даже если они не самые большие вещи в куче.

Я лично считаю, что MAT лучше подходит для аналитической работы, чем VisualVM, хотя VisualVM отлично подходит для мониторинга использования памяти на лету и наблюдения за циклами GC.

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

Справочная документация, включенная в MAT, довольно хороша, и ее определенно стоит прочитать, чтобы помочь вам начать работу.

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

MAT можно найти здесь: http://www.eclipse.org/mat/


Я откопал кое-какие справочные материалы (некоторые из них немного устарели, но все еще актуальны, чтобы лучше представить, как подходить к проблеме)

Утечки легко найти , но анализ использования памяти немного сложнее
Утечки памяти легко обнаружить
Поиск утечек памяти с помощью анализатора памяти SAP

Также стоит немного разобраться в сборщике мусора при просмотре кучи, поэтому стоит просмотреть их:
Настройка GC
Диагностика проблемы со сборкой мусора

person BunjiquoBianco    schedule 13.12.2012
comment
Спасибо за информацию. Я сегодня дочитаю. Некоторые тесты, которые я проводил с моим кодом, который вообще не работал, также указывали на другие источники утечки памяти. Приятно видеть, что MAT показал это, и тестирование подтвердило это. - person Jason; 13.12.2012