Spec-Zone.ru › OpenJDK 25

Интерфейс 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.
  • Способы доступа к MXBeans

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

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

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

getObjectName

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

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, представляющий использование памяти вне кучи.

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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.management/java/lang/management/MemoryMXBean.html

Spec-Zone.ru

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