Мой java jar — лишь один из многих, которые использует более крупная программа. Я пытаюсь определить, является ли мой код причиной утечки памяти или есть другие проблемы вне моего кода. Я использую jvisualvm и определил все свои классы, и ни один из них не кажется подозрительным. Глядя на сэмплер, я вижу, что byte[], char[] и int[] являются самыми популярными пользователями с точки зрения размера и созданных экземпляров. проблема в том, что я не могу определить, кому они принадлежат. Я знаю, что у меня есть разные байты [] в моей программе, но поскольку их около 32 000 экземпляров, трудно определить источник, просматривая их один за другим. Есть ли способ отфильтровать данные, чтобы можно было просматривать только элементы, происходящие из определенной банки или области? Спасибо.
использование Jvisualvm для обнаружения утечек памяти
Ответы (1)
Если вы не знаете, что создаете много экземпляров byte[]
или String
, я бы не стал ставить деньги на то, что byte[]
или char[]
являются источником проблемы. Почти в каждой куче, которую я перерыл, есть множество таких, поскольку они используются во многих частях внутренностей Java. Я не говорю, что они не могут быть проблемой, но полезнее сначала сконцентрироваться на необычном количестве объектов, которые, как вы знаете, вы создаете, даже если они не самые большие вещи в куче.
Я лично считаю, что MAT лучше подходит для аналитической работы, чем VisualVM, хотя VisualVM отлично подходит для мониторинга использования памяти на лету и наблюдения за циклами GC.
MAT также позволяет детализировать информацию, чтобы увидеть входящие и исходящие ссылки на сохраненные объекты. Это даст вам лучшее представление о том, какие объекты занимают больше памяти, чем вы ожидаете, и должно помочь вам выяснить, является ли виновником один из объектов из вашего JAR.
Справочная документация, включенная в MAT, довольно хороша, и ее определенно стоит прочитать, чтобы помочь вам начать работу.
Если вы хотите еще больше углубиться в кроличью нору, прочитайте OQL, который вы можете использовать для запроса кучи как в MAT, так и в VisualVM.
MAT можно найти здесь: http://www.eclipse.org/mat/
Я откопал кое-какие справочные материалы (некоторые из них немного устарели, но все еще актуальны, чтобы лучше представить, как подходить к проблеме)
Утечки легко найти , но анализ использования памяти немного сложнее
Утечки памяти легко обнаружить
Поиск утечек памяти с помощью анализатора памяти SAP
Также стоит немного разобраться в сборщике мусора при просмотре кучи, поэтому стоит просмотреть их:
Настройка GC
Диагностика проблемы со сборкой мусора