Рубрики
Без рубрики

Остановка утечки памяти Java

Анализ и остановка утечки памяти в приложении Java. Помеченный java, утечка памяти, производительность.

Объекты Java хранятся в области памяти, называемой кучей. Эта область увеличивается и уменьшается в размерах, но имеет ограниченное пространство, определяемое несколькими факторами, в зависимости от версии Java, на которой работает ваше приложение. Независимо от того, как вы достигнете этого предела, вы получите ошибку типа OutOfMemoryError . Если вы увеличите максимальное выделение памяти, установив параметр jvm -Xmx , и ваше приложение продолжит превышать лимит и выдавать эти ошибки, очень вероятно, что у вас произошла утечка памяти.

Утечка памяти происходит, когда ваше приложение начинает хранить в памяти больше объектов, чем может удалить сборщик мусора. Объект может быть удален из памяти сборщиком мусора, когда на него нет ссылок, это означает, что ваше приложение хранит ссылки на объекты, которые ему больше не нужны, или которые необходимо обрабатывать другим способом, чтобы предотвратить заполнение кучи.

Принимая свалку кучи

Первое, что вам нужно иметь, чтобы правильно знать, что происходит в управлении памятью вашего приложения, – это дамп кучи. Есть несколько способов, которыми вы можете это сделать. Первый из них заключается в включении автоматического сброса кучи, когда ваше приложение достигает OutOfMemoryError . Вы можете включить это с помощью параметров командной строки, например, при запуске приложения: java-XX:+HeapDumpOnOutOfMemoryError/избранное/путь MyApp

  • -XX:+HeapDumpOnOutOfMemoryError заставляет JVM создавать дамп кучи, когда в приложении заканчивается память.
  • -XX:HeapDumpPath=мой/любимый/путь указывает местоположение, в котором вы хотите сохранить дамп.

Другой способ получить дамп кучи – использовать инструмент map jdk. Если ваше приложение работает только с JRE, вам придется установить JDK, чтобы вы могли использовать jmap . Команда используется следующим образом: map.bin <идентификатор процесса>

Приведенные ниже параметры полезны для выполнения анализа в производственной среде, поскольку вы можете извлечь дамп кучи, скопировать файл на свой компьютер и загрузить его в инструмент. Другой способ извлечения дампа кучи – удаленное подключение инструмента к запущенному приложению java. Это предполагает использование JMX, для которого, в свою очередь, требуется открытый порт, но если приложение запущено локально, на том же компьютере, что и ваш инструмент, вы увидите его в списке: как только вы подключитесь к приложению, вы сможете загрузить дамп кучи. Обратитесь к документации и учебным пособиям для каждого инструмента, чтобы узнать, как получить дамп кучи.

Анализируя данные

После того, как у вас будет дамп кучи, пришло время изучить данные и определить, что вызывает утечку памяти. Файл дампа может быть проанализирован с помощью многих инструментов, коммерческих, бесплатных и с открытым исходным кодом. Я бы рекомендовал два инструмента: jvisualvm и анализатор памяти eclipse. Если вы установили JDK в своей среде, у вас уже есть jvisualvm (он находится в каталоге bin). Анализатор памяти eclipse (MAT) представляет собой eclipse.org проект, и его можно загрузить с здесь .

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

Если вы решите использовать MAT, я настоятельно рекомендую следовать процессу, описанному в этом сообщении в блоге, в котором автор описывает, как инструмент организует данные и дает инструкции о том, как указать на виновника.

Оригинал: “https://dev.to/pmadridb/stopping-a-java-memory-leak-35ae”