Первоначально опубликовано на https://www.linkedin.com 22 июля 2018 г.

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

Что такое утечка памяти?

Утечка памяти происходит, когда объекты больше не используются приложением, но сборщик мусора не может удалить их из рабочей памяти, потому что на них по-прежнему ссылаются. В результате приложение потребляет все больше и больше ресурсов, что в конечном итоге приводит к фатальной ошибке OutOfMemoryError.

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

Инструменты для создания дампа кучи и анализа

Сценарий, приводящий к утечке памяти

Утечки кучи Java (OutOfMemoryError)

  1. Объекты создаются постоянно, но не освобождаются:

Это происходит, когда создается бесконечный цикл объектов, когда память не освобождается, поскольку текущий поток все еще выполняет операции. В этом примере мы можем изменить размер кучи Java на 32 м, установив аргументы виртуальной машины -Xms и -Xmx. Здесь -Xms обозначает начальный размер (байты) кучи java, -Xms - максимальный размер в байтах пула распределения памяти.

Если вам нужен дамп кучи при нехватке памяти, вы можете запустить Java с опцией аргументов виртуальной машины как

В конфигурации «Выполнить» мы устанавливаем размер кучи на 32 Мб. Откройте вкладку Аргументы и добавьте параметры-Xmx32min в раздел аргументов ВМ. Вы также можете установить -Xms32m (небольшой размер кучи).

Пример программы для генерации OutOfMemoryError

Бесконечное создание экземпляров объектов с помощью while Loop, которое приводит к OutOfMemoryError. При запуске программы вы получите исключение времени выполнения.

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

Использование инструмента JVisualVM для анализа дампа кучи.

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

Объекты, которые еще не собраны мусором.

Использование JMAT Tool для анализа дампа кучи

При открытии дампа кучи на вкладке «Обзор» отображается следующая информация.

Вы можете щелкнуть гистограмму, чтобы получить иерархию классов, которая показывает имя класса, объекты и состояние кучи.

Вы можете прокрутить вниз вкладку «Обзор» и затем щелкнуть «Подозреваемые утечки», чтобы найти подробности, как показано на снимках экрана ниже, чтобы определить класс, ответственный за OutOfMemoryError, и количество созданных объектов.

2. Незакрытые соединения (утечка базы данных):

Когда кто-то пытается установить соединение с базой данных, но не закрывает его. Это будет свидетельствовать о том, что кто-то использует getConnection (), а затем не закрывает соединение по завершении. Например, если у кого-то есть close () в блоке try {}, но он не вставил раздел finally {}. Таким образом, вы пропускаете соединения, и когда кто-то идет в пул, чтобы получить соединение, пул блокирует вас, потому что все доступные соединения используются.

Когда мы смотрим в дамп на этом сервере, похоже, что большая часть потока ожидает подключения к БД.

Из-за утечки базы данных мы не можем получить к ней новое подключение, так как все ресурсы в настоящее время используются.

Этого можно избежать, закрыв соединение в блоке finally.

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



Если вам понравилось это читать, вы можете нажать на хлопок и сообщить об этом другим. Если вы хотите, чтобы я добавил что-нибудь еще, не стесняйтесь оставлять отзыв 💬