Я обнаружил, какие объекты вызывают утечку памяти, и что теперь? - PullRequest
0 голосов
/ 07 января 2011

Используя команду jmap -histo в работающем процессе, каждые 30 минут или около того, я обнаружил один тип объекта, который явно является утечкой памяти (в настольном приложении).

Объект, ответственный за утечку ( Т.е.. единственный вид объекта, число экземпляров которого увеличивается со временем и на огромную сумму): int [] .

Я подозреваю, что BufferedImage является виновником, но я не уверен в этом (я очень заботился о том, чтобы смыть / обнулить BufferedImage s, но я все еще думаю, что именно в этом причина утечки).

Однако я также использую int [] в другой части программы, и я просто не уверен, откуда происходит утечка. Вывод jmap -histo немного "тонкий", на мой взгляд.

Как теперь определить, где происходят утечки int[].

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

Однако в моем случае мне нужно что-то еще.

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

Зная, что мое приложение (или API, который использует мое приложение) протекает int [] , какие шаги я могу предпринять (например, с помощью вашего любимого профилировщика), чтобы, надеюсь, найти утечки

Инструмент должен работать на Java 1.5 OS X 10.4 Apple JVM.

Ответы [ 2 ]

1 голос
/ 08 января 2011

Я бы рекомендовал сначала использовать Eclipse MAT, так как лично я не знаю возможностей jProfiler. Затем, когда вы загружаете свой дамп кучи, вы можете проверить некоторые входящие ссылки на int []. Вы можете точно определить, кто создал массивы, и посмотреть, какой класс удержания действительно создает огромное количество.

1 голос
/ 08 января 2011

Вам нужно отсортировать объекты по Retained Heap.Вы найдете значимый объект / класс, который содержит все int [] очень быстро.

...