Интерфейс MemoryMXBean
- Все суперинтерфейсы:
PlatformManagedObject
public interface MemoryMXBean extends PlatformManagedObject
Виртуальная машина Java имеет единственный экземпляр реализующего класса этого интерфейса. Этот экземпляр, реализующий этот интерфейс, является MXBean, который можно получить, вызвав метод ManagementFactory.getMemoryMXBean() или метод platform MBeanServer.
Идентификатор ObjectName для уникальной идентификации MXBean для системы памяти внутри MBeanServer:
java.lang:type=Memory Его можно получить, вызвав метод PlatformManagedObject.getObjectName(). Память
Система памяти виртуальной машины Java управляет следующими типами памяти:1. Куча (Heap)
Виртуальная машина Java имеет кучу (heap), которая является областью данных времени выполнения, из которой выделяется память для всех экземпляров классов и массивов. Она создается при запуске виртуальной машины Java. Память кучи для объектов освобождается автоматической системой управления памятью, известной как мусорный сборщик (garbage collector).Размер кучи может быть фиксированным или может изменяться. Память для кучи не обязательно должна быть непрерывной.
2. Не-кучная память (Non-Heap Memory)
Виртуальная машина Java управляет памятью, отличной от кучи (называемой не-кучной памятью (non-heap memory)).Виртуальная машина Java имеет область методов (method area), которая используется всеми потоками. Область методов принадлежит к не-кучной памяти. Она хранит структуры на основе класса, такие как пул констант времени выполнения, данные полей и методов, а также код методов и конструкторов. Она создаётся при запуске виртуальной машины Java.
Логически область методов является частью кучи, но реализация виртуальной машины Java может выбрать не производить сборку мусора или уплотнение в ней. Аналогично куче, размер области методов может быть фиксированным или изменяться. Память для области методов не обязательно должна быть непрерывной.
Помимо области методов, реализация виртуальной машины Java может потребовать памяти для внутренних процессов или оптимизации, что также относится к не-кучной памяти. Например, компилятор JIT требует памяти для хранения машинного кода, переведённого из кода виртуальной машины Java для повышения производительности.
Пулы памяти и менеджеры памяти
Memory pools и memory managers являются абстрактными сущностями, которые отслеживают и управляют системой памяти виртуальной машины Java. Пул памяти представляет собой область памяти, которой управляет виртуальная машина Java. Виртуальная машина Java имеет как минимум один пул памяти, и она может создавать или удалять пулы памяти во время выполнения. Пул памяти может относиться к куче или к не-кучной памяти.
Менеджер памяти отвечает за управление одним или несколькими пулами памяти. Мусорный сборщик является одним из типов менеджеров памяти, ответственных за освобождение памяти, занимаемой недостижимыми объектами. Виртуальная машина Java может иметь один или несколько менеджеров памяти. Она может добавлять или удалять менеджеров памяти во время выполнения. Один пул памяти может управляться несколькими менеджерами памяти.
Мониторинг использования памяти
Использование памяти — очень важный атрибут для мониторинга системы памяти. Использование памяти, например, может указывать на:- использование памяти приложением,
- нагрузку, накладываемую на автоматическую систему управления памятью,
- возможную утечку памяти.
Использование памяти можно отслеживать тремя способами:
- Опрос (Polling)
- Уведомление о пороге использования (Usage Threshold Notification)
- Уведомление о пороге использования при сборке мусора (Collection Usage Threshold Notification)
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);
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
gc() |
Выполняет сборку мусора. |
MemoryUsage |
getHeapMemoryUsage() |
Возвращает текущее использование памяти кучи, используемой для выделения объектов. |
MemoryUsage |
getNonHeapMemoryUsage() |
Возвращает текущее использование памяти не-кучной памяти, используемой виртуальной машиной Java. |
int |
getObjectPendingFinalizationCount() |
Возвращает приблизительное число объектов, для которых ожидает завершение финализации. |
boolean |
isVerbose() |
Проверяет, включен ли подробный вывод для системы памяти. |
void |
setVerbose |
Включает или отключает подробный вывод для системы памяти. |
Методы, объявленные в интерфейсе java.lang.management.PlatformManagedObject
getObjectName
Подробное описание методов
getObjectPendingFinalizationCount
int getObjectPendingFinalizationCount()
- Возвращает:
- приблизительное число объектов, для которых ожидается завершение финализации.
getHeapMemoryUsage
MemoryUsage getHeapMemoryUsage()
used и committed размер возвращаемого использования памяти — сумма этих значений для всех пулов памяти кучи, в то время как init и max размер возвращаемого использования памяти представляет настройку памяти кучи, которая может не быть суммой этих значений для всех пулов памяти кучи. Количество используемой памяти в возвращаемом использовании памяти — это количество памяти, занимаемой как живыми объектами, так и объектами мусора, которые не были собраны, если таковые имеются.
Доступ к MBeanServer:
Сопоставленный тип MemoryUsage — это CompositeData с атрибутами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsage, представляющий использование памяти кучи.
getNonHeapMemoryUsage
MemoryUsage getNonHeapMemoryUsage()
used и committed размер возвращаемого использования памяти — сумма этих значений для всех пулов памяти вне кучи, в то время как init и max размер возвращаемого использования памяти представляет настройку памяти вне кучи, которая может не быть суммой этих значений для всех пулов памяти вне кучи. Доступ к MBeanServer:
Сопоставленный тип MemoryUsage — это CompositeData с атрибутами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsage, представляющий использование памяти вне кучи.
isVerbose
boolean isVerbose()
- Возвращает:
-
true, если подробный вывод для системы памяти включен;falseв противном случае.
setVerbose
void setVerbose(boolean value)
Каждое обращение к этому методу включает или выключает подробный вывод глобально.
- Параметры:
-
value-trueдля включения подробного вывода;falseдля выключения. - Исключения:
-
SecurityException- если существует менеджер безопасности, и у вызывающего процесса нет разрешения ManagementPermission("control").
gc
void gc()
gc() фактически эквивалентен вызову: System.gc()
- См. также:
© 1993, 2021, 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/17/docs/api/java.management/java/lang/management/MemoryMXBean.html