Интерфейс MemoryMXBean
- Все суперинтерфейсы:
PlatformManagedObject
public interface MemoryMXBean extends PlatformManagedObject
Интерфейс управления системой памяти виртуальной машины Java.
В виртуальной машине Java существует единственный экземпляр класса-реализации этого интерфейса. Этот экземпляр, реализующий данный интерфейс, является MXBean, который можно получить, вызвав метод ManagementFactory.getMemoryMXBean() или метод platform MBeanServer.
Идентификатор MXBean для системы памяти в рамках MBeanServer:
java.lang:type=Memory Его можно получить, вызвав метод PlatformManagedObject.getObjectName(). Память
Система памяти виртуальной машины Java управляет следующими типами памяти:1. Куча
Виртуальная машина Java имеет кучу (heap), которая является областью данных во время выполнения, из которой выделяется память для всех экземпляров классов и массивов. Она создается при запуске виртуальной машины Java. Память кучи для объектов освобождается автоматической системой управления памятью, известной как мусорный сборщик (garbage collector).Размер кучи может быть фиксированным или может расширяться и уменьшаться. Память для кучи не обязательно должна быть непрерывной.
2. Не-кучевая память
Виртуальная машина Java управляет памятью, отличной от кучи (называемой не-кучевой памятью).В виртуальной машине Java есть область методов (method area), общая для всех потоков. Область методов относится к не-кучевой памяти. Она хранит структуры на основе классов, такие как пул констант времени выполнения, данные о полях и методах, а также код методов и конструкторов. Она создается при запуске виртуальной машины Java.
Логически область методов является частью кучи, но реализация виртуальной машины Java может выбрать не использовать сборку мусора или компакцию для неё. Аналогично куче, область методов может иметь фиксированный размер или расширяться и уменьшаться. Память для области методов не обязательно должна быть непрерывной.
Помимо области методов, реализация виртуальной машины Java может потребовать памяти для внутренней обработки или оптимизации, которая также относится к не-кучевой памяти. Например, компилятор JIT требует памяти для хранения кода машинного языка, переведённого из кода виртуальной машины Java для повышения производительности.
Пулы памяти и менеджеры памяти
Memory pools и memory managers — это абстрактные сущности, которые отслеживают и управляют системой памяти виртуальной машины Java. Пул памяти представляет собой область памяти, которую управляет виртуальная машина Java. У виртуальной машины Java есть как минимум один пул памяти, и она может создавать или удалять пулы памяти во время выполнения. Пул памяти может относиться либо к куче, либо к не-кучевой памяти.
Менеджер памяти отвечает за управление одним или несколькими пулами памяти. Сборщик мусора — это один из типов менеджеров памяти, ответственных за освобождение памяти, занятой недостижимыми объектами. Виртуальная машина Java может иметь один или несколько менеджеров памяти. Она может добавлять или удалять менеджеров памяти во время выполнения. Одним пулом памяти могут управлять несколько менеджеров памяти.
Мониторинг использования памяти
Использование памяти — очень важный атрибут для мониторинга системы памяти. Использование памяти, например, может указывать на:- использование памяти приложением,
- нагрузку, накладываемую на автоматическую систему управления памятью,
- возможную утечку памяти.
Использование памяти можно отслеживать тремя способами:
- Опрос
- Уведомление о пороге использования
- Уведомление о пороге использования при сборе
MemoryPoolMXBean. Механизм мониторинга использования памяти предназначен для распределения нагрузки или распределения рабочей нагрузки. Например, приложение прекратит получать новые рабочие задачи, когда использование памяти превысит определённый порог. Он не предназначен для того, чтобы приложение обнаруживало и восстанавливалось после низкого уровня памяти.
Уведомления
Этот MemoryMXBean является NotificationEmitter, который отправляет два типа уведомлений notifications в случае, если хотя бы один из пулов памяти поддерживает порог использования usage threshold или порог использования при сборе collection usage threshold, что можно определить, вызвав методы MemoryPoolMXBean.isUsageThresholdSupported() и MemoryPoolMXBean.isCollectionUsageThresholdSupported().
-
usage threshold exceeded notification— для уведомления о том, что использование памяти в пуле памяти увеличилось и достигло или превысило значение его порога использования usage threshold. -
collection usage threshold exceeded notification— для уведомления о том, что использование памяти в пуле памяти больше или равно его порогу использования при сборе collection usage threshold после того, как виртуальная машина 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) | Включает или выключает подробный вывод для системы памяти. |
Методы, объявленные в интерфейсе java.lang.management.PlatformManagedObject
getObjectName Методы
getObjectPendingFinalizationCount
int getObjectPendingFinalizationCount()
Возвращает приблизительное количество объектов, для которых ожидается завершение финализации.
- Возвращает:
- приблизительное количество объектов, для которых ожидается завершение финализации.
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для отключения. - Выбрасывает:
-
SecurityException- если существует менеджер безопасности, и у вызывающего объекта нет разрешения ManagementPermission("control").
gc
void gc()
Выполняет сборщик мусора. Вызов gc() фактически эквивалентен вызову:
System.gc()
- См. также:
System.gc()
© 1993, 2020, 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/11/docs/api/java.management/java/lang/management/MemoryMXBean.html