Интерфейс 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() Возвращает приблизительное число объектов, для которых ожидается финализация. |
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.