Вход |  Регистрация

Все Тэги

Счетчики памяти Java

25.06.20131094 просм.

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

Счетчики памяти: 

Данные счётчики, которые обычно представлены в закладке Memory программы JConsole. Они отражают информацию об использовании ресурсов памяти, пулов, а также статистику сборки мусора.

Доступность пулов памяти зависит от того, какая используется JVM. В приведённом ниже списке – пулы для виртуальной машины HotSpot, стандартной в случае установки Sun Java.

  • Eden Space Pool (куча). Под большинство объектов из этого пула изначально выделена память.
  • Survivor Space Pool (куча). Содержит объекты, которые «пережили» сборку мусора в Eden Space pool.
  • Tenured Generation Pool (куча). Здесь хранятся объекты, некоторое время просуществовавшие в Survivor Space pool.
  • Permanent Generation Pool (не куча). Хранит всю отображаемую информацию самой виртуальной машины, такую как объекты классов и методов. На JVM-ах, которые используют обмен данными классов, этот пул разделён на 2 зоны: «только чтение» и «чтение и запись».
  • Code Cache Pool (не куча). JVM HotSpot также имеет “кэш кода”, в котором содержится память, используемая для компиляции и хранения исходного кода.

Каждый пул памяти может иметь два вида пороговых значений для поддержки обнаружения нехватки памяти: порог использования и порог использования после сборки. Ни один из этих порогов не может быть поддержан конкретным пулом памяти.

  • Порог использования. Управляемый атрибут пула памяти. Позволяет мониторить использование памяти без особой дополнительной нагрузки на систему. Установка положительного порогового значения включает функцию проверки порога использования для пула памяти. Установка нулевого значения отключает проверку. Значение по умолчанию устанавливает JVM. JVM выполняет проверку порога использования в пуле памяти в самое подходящее время: обычно во время сборки мусора, иногда во время распределения памяти. Если JVM обнаруживает, что текущее использование памяти превышает порог использования, она присваивает атрибуту UsageThresholdExceeded значение «истина».
  • Порог использования после сборки. Управляемый атрибут некоторых пулов памяти со сборкой мусора. После того, как JVM провела в пуле сборку мусора, некоторый объем памяти в нём по-прежнему занимают достижимые объекты. Порог использования после сборки позволяет установить определённое значение для проверки на предмет использования памяти только после сборки мусора. Если JVM обнаруживает, что использование памяти превышает пороговое значение, она присваивает атрибуту CollectionUsageThresholdExceeded значение «истина».

JVM управляет двумя видами памяти, которые создаются при запуске JVM:

  • Динамическая память (куча). Область исполняемых данных, из которой JVM выделяет память для всех экземпляров класса и массивов. Куча может быть фиксированного или переменного размера. Сборщик мусора – это автоматическая система управления памятью, которая восстанавливает динамическую память для объектов.
  • Внутренняя память (не куча). Включает в себя область методов, разделяемую всеми потоками, и память, необходимую для внутренней работы и оптимизации JVM. Здесь хранятся поклассовые структуры, такие как постоянный исполняемый пул, данные полей и методов, и код для методов и конструкторов. По логике, область методов является частью кучи, но, в зависимости реализации, JVM может не проводить сборку мусора или его сжатие. Как и куча, область методов может быть фиксированного или переменного размера. Память для области методов не обязательно должна быть непрерывной.

Кроме области методов, для реализации JVM может понадобиться память для внутреннего управления и оптимизации, которая также относится к внутренней памяти. Например, JIT-компилятору для высокой производительности требуется память для хранения исходного машинного кода, переведённого из кода JVM.

Пожалуй, стоит особо отметить, что задержки, вызванные сборкой мусора, причиняют дискомфорт, особенно тем пользователям, у которых конфигурация памяти далека от идеальной. Есть множество настроек, которые влияют на сборку мусора и то, как JVM выделяет память. Основная цель мониторинга сборки мусора, а затем и её настройки – снизить частоту процедур полной сборки без увеличения их совокупной длительности.

В следующей заметке мы расскажем о счетчиках потоков и классов Java.

 

Метки: , , ,

Добавить комментарий

Для отправки комментария вам необходимо авторизоваться.

Партнеры DevOpsHub и DevOpsWiki