Spec-Zone.ru › OpenJDK 27

Интерфейс MemoryMXBean

Все суперинтерфейсы:
PlatformManagedObject
public interface MemoryMXBean extends PlatformManagedObject
Интерфейс управления системой памяти виртуальной машины Java.

У виртуальной машины Java имеется единственный экземпляр класса реализации этого интерфейса. Этот экземпляр, реализующий данный интерфейс, является MXBean, который можно получить, вызвав метод ManagementFactory.getMemoryMXBean() или метод platform MBeanServer.

ObjectName для уникальной идентификации MXBean системы памяти в MBeanServer:

java.lang:type=Memory
Его можно получить, вызвав метод PlatformManagedObject.getObjectName().

Память

Система памяти виртуальной машины Java управляет следующими видами памяти:

1. Куча

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

Куча может иметь фиксированный размер либо увеличиваться и уменьшаться. Память кучи не обязательно должна быть непрерывной.

2. Память вне кучи

Виртуальная машина Java управляет памятью, отличной от кучи (называемой памятью вне кучи).

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

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

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

Пулы памяти и менеджеры памяти

Memory pools и memory managers — это абстрактные сущности, которые отслеживают систему памяти виртуальной машины Java и управляют ею.

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

Менеджер памяти отвечает за управление одним или несколькими пулами памяти. Сборщик мусора — это разновидность менеджера памяти, отвечающего за освобождение памяти, занятой недостижимыми объектами. Виртуальная машина Java может иметь один или несколько менеджеров памяти. Во время выполнения она может добавлять или удалять менеджеры памяти. Одним пулом памяти могут управлять несколько менеджеров памяти.

Мониторинг использования памяти

Использование памяти — важный атрибут для мониторинга системы памяти. Например, сведения об использовании памяти могут указывать на:
  • использование памяти приложением;
  • нагрузку, создаваемую для системы автоматического управления памятью;
  • возможную утечку памяти.

Использование памяти можно отслеживать тремя способами:

  • опрос
  • уведомление о пороговом значении использования
  • уведомление о пороговом значении использования после сборки мусора
Подробное описание приведено в интерфейсе MemoryPoolMXBean.

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

Уведомления

Этот MemoryMXBean является NotificationEmitter, отправляющим два типа уведомлений о памяти notifications, если хотя бы один из пулов памяти поддерживает пороговое значение использования или пороговое значение использования после сборки мусора. Это можно определить, вызвав методы MemoryPoolMXBean.isUsageThresholdSupported() и MemoryPoolMXBean.isCollectionUsageThresholdSupported().

  • usage threshold exceeded notification — уведомляет об увеличении использования памяти пулом памяти до значения, равного или превышающего пороговое значение использования.
  • collection usage threshold exceeded notification — уведомляет о том, что использование памяти пулом памяти после того, как виртуальная машина Java предприняла попытку освободить неиспользуемые объекты в этом пуле, стало равным или превысило пороговое значение использования после сборки мусора.

Отправляемое уведомление является экземпляром Notification, свойству user data которого присвоен объект CompositeData, представляющий объект MemoryNotificationInfo со сведениями о пуле памяти на момент создания уведомления. CompositeData содержит атрибуты, описанные в MemoryNotificationInfo.

NotificationEmitter

Объект MemoryMXBean, возвращаемый методом ManagementFactory.getMemoryMXBean(), реализует интерфейс NotificationEmitter, который позволяет зарегистрировать в MemoryMXBean прослушиватель уведомлений. Ниже приведён пример кода, в котором регистрируется MyListener для обработки уведомлений, отправляемых MemoryMXBean.
class MyListener implements javax.management.NotificationListener {
    public void handleNotification(Notification notif, Object handback) {
        // handle notification
        ....
    }
}

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationEmitter emitter = (NotificationEmitter) mbean;
MyListener listener = new MyListener();
emitter.addNotificationListener(listener, null, null);
Начиная с версии:
1.5
См. также:
  • ManagementFactory.getPlatformMXBeans(Class)
  • Спецификация JMX.
  • Способы доступа к MXBean

Краткое описание методов

Модификатор и тип Метод Описание
void gc()
Запускает сборщик мусора.
MemoryUsage getHeapMemoryUsage()
Возвращает текущее использование памяти кучи, выделяемой для объектов.
MemoryUsage getNonHeapMemoryUsage()
Возвращает текущее использование памяти вне кучи виртуальной машиной Java.
int getObjectPendingFinalizationCount()
Устарело.
Финализация признана устаревшей и подлежащей удалению.
default long getTotalGcCpuTime()
Возвращает приблизительное суммарное время в наносекундах, затраченное на сборку мусора (GC).
boolean isVerbose()
Проверяет, включён ли подробный вывод для системы памяти.
void setVerbose(boolean value)
Включает или отключает подробный вывод для системы памяти.

Методы, объявленные в интерфейсе PlatformManagedObject

getObjectName
Модификатор и тип Метод Описание
ObjectName getObjectName()
Возвращает экземпляр ObjectName, представляющий имя объекта этого управляемого объекта платформы.

Подробное описание методов

getObjectPendingFinalizationCount

@Deprecated(since="18") int getObjectPendingFinalizationCount()
Устарело.
Финализация признана устаревшей и подлежащей удалению. Подробности см. в разделе Object.finalize().
Возвращает приблизительное число объектов, ожидающих финализации.
Возвращает:
приблизительное число объектов, ожидающих финализации. Если этот MemoryMXBean содержит сведения о JVM, в которой финализация отключена или удалена, метод всегда возвращает ноль.

getHeapMemoryUsage

MemoryUsage getHeapMemoryUsage()
Возвращает текущее использование памяти кучи, выделяемой для объектов. Куча состоит из одного или нескольких пулов памяти. Размеры used и committed возвращаемого значения использования памяти равны сумме соответствующих значений всех пулов памяти кучи, тогда как размеры init и max возвращаемого значения отражают заданные параметры памяти кучи, которые могут не совпадать с суммой соответствующих значений всех пулов памяти кучи.

Используемая память, указанная в возвращаемом значении, — это память, занимаемая как живыми объектами, так и, если они есть, объектами-мусором, которые ещё не были собраны.

Доступ через MBeanServer:
Отображаемый тип MemoryUsage — это CompositeData с атрибутами, указанными в MemoryUsage.

Возвращает:
объект MemoryUsage, представляющий использование памяти кучи.

getNonHeapMemoryUsage

MemoryUsage getNonHeapMemoryUsage()
Возвращает текущее использование памяти вне кучи виртуальной машиной Java. Память вне кучи состоит из одного или нескольких пулов памяти. Размеры used и committed возвращаемого значения использования памяти равны сумме соответствующих значений всех пулов памяти вне кучи, тогда как размеры init и max возвращаемого значения отражают заданные параметры памяти вне кучи, которые могут не совпадать с суммой соответствующих значений всех пулов памяти вне кучи.

Доступ через MBeanServer:
Отображаемый тип MemoryUsage — это CompositeData с атрибутами, указанными в MemoryUsage.

Возвращает:
объект MemoryUsage, представляющий использование памяти вне кучи.

getTotalGcCpuTime

default long getTotalGcCpuTime()
Возвращает приблизительное суммарное время в наносекундах, затраченное на сборку мусора (GC).

Время, затраченное на GC, — это процессорное время, использованное всеми операциями GC, включая любые накладные расходы. Это означает, что результат может быть ненулевым, даже если сборка мусора не выполнялась. Метод возвращает -1, если платформа не поддерживает эту операцию или сведения недоступны.

Примечание API:
Можно использовать совместно с jdk.management/com.sun.management.OperatingSystemMXBean#getProcessCpuTime() для вычисления общей доли процессорного времени, используемой GC.
Требования к реализации:
Реализация по умолчанию возвращает -1.
Примечание по реализации:
Определение времени, затраченного на GC, в значительной степени зависит от реализации. В виртуальной машине HotSpot это время включает специфичные для реализации детали, такие как управляющие потоки, рабочие потоки, операции виртуальной машины и дедупликация строк (если она включена). Управляющие потоки могут создаваться сборщиком мусора для координации его работы. Метод может вернуть -1, если измерение невозможно, например во время завершения работы.
Возвращает:
общее накопленное процессорное время GC в наносекундах или -1.
Начиная с версии:
26

isVerbose

boolean isVerbose()
Проверяет, включён ли подробный вывод для системы памяти.
Возвращает:
true, если подробный вывод для системы памяти включён; в противном случае — false.

setVerbose

void setVerbose(boolean value)
Включает или отключает подробный вывод для системы памяти. Состав подробных сведений и поток вывода, в который они направляются, зависят от реализации. Как правило, реализация виртуальной машины Java выводит сообщение при каждом освобождении памяти во время сборки мусора.

Каждый вызов этого метода включает или отключает подробный вывод глобально.

Параметры:
value — true для включения подробного вывода; false для отключения.

gc

void gc()
Запускает сборщик мусора. Вызов gc() фактически эквивалентен вызову:
System.gc()
См. также:
  • System.gc()

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API