Интерфейс MemoryPoolMXBean
- Все супер-интерфейсы:
PlatformManagedObject
public interface MemoryPoolMXBean extends PlatformManagedObject
memory managers. Виртуальная машина Java имеет один или несколько экземпляров класса реализации этого интерфейса. Экземпляр, реализующий этот интерфейс, является MXBean, который можно получить, вызвав метод ManagementFactory.getMemoryPoolMXBeans() или из метода platform MBeanServer.
ObjectName для уникальной идентификации MXBean пула памяти в пределах MBeanServer имеет вид:
Его можно получить, вызвав методjava.lang:type=MemoryPool,name=имя пула
PlatformManagedObject.getObjectName(). Тип памяти
Виртуальная машина Java использует кучу для размещения объектов, а также поддерживает память вне кучи для области методов и выполнения виртуальной машины Java. Виртуальная машина Java может иметь один или несколько пулов памяти. Каждый пул памяти представляет область памяти одного из следующих типов:
Мониторинг использования памяти
Пул памяти имеет следующие атрибуты:- Использование памяти
- Пиковое использование памяти
- Порог использования
- Порог использования после сборки мусора (поддерживается только некоторыми пулами памяти со сборкой мусора)
1. Использование памяти
МетодgetUsage() возвращает оценку текущего использования пула памяти. Для пула памяти со сборкой мусора объем используемой памяти включает память, занятую всеми объектами в пуле, как достижимыми, так и недостижимыми. В целом этот метод представляет собой легковесную операцию для получения приблизительного значения использования памяти. Для некоторых пулов памяти, например когда объекты расположены непоследовательно, вызов этого метода может быть затратной операцией, требующей вычислений для определения текущего использования памяти. Реализация должна документировать такие случаи.
2. Пиковое использование памяти
Виртуальная машина Java поддерживает пиковое использование памяти пула с момента запуска виртуальной машины или сброса пикового значения. Пиковое использование памяти возвращается методомgetPeakUsage() и сбрасывается вызовом метода resetPeakUsage(). 3. Порог использования
У каждого пула памяти есть управляемый атрибут, называемый порогом использования, значение по умолчанию для которого задается виртуальной машиной Java. Значение по умолчанию зависит от платформы. Порог использования можно задать с помощью методаsetUsageThreshold. Если порог задан положительным значением, в этом пуле памяти включается проверка превышения порога использования. Если порог использования равен нулю, проверка превышения порога использования для этого пула памяти отключается. Метод isUsageThresholdSupported() позволяет определить, поддерживается ли эта функция. Виртуальная машина Java проверяет превышение порога использования для каждого пула памяти в наиболее подходящий момент, обычно во время сборки мусора. Каждый пул памяти поддерживает счетчик usage threshold count, который увеличивается каждый раз, когда виртуальная машина Java обнаруживает превышение порога использования памяти в пуле.
Этот управляемый атрибут порога использования предназначен для мониторинга тенденции роста использования памяти с небольшими накладными расходами. Для некоторых пулов памяти порог использования может быть неприменим. Например, поколенческий сборщик мусора — распространенный алгоритм сборки мусора, используемый во многих реализациях виртуальной машины Java, — управляет двумя или более поколениями, разделяя объекты по возрасту. Большинство объектов размещается в самом молодом поколении (например, в пуле памяти молодого поколения). Пул памяти молодого поколения рассчитан на заполнение, а его сборка мусора освобождает большую часть пространства, поскольку предполагается, что он содержит главным образом короткоживущие объекты, которые в основном недостижимы во время сборки мусора. В этом случае порог использования для пула памяти молодого поколения поддерживать нецелесообразно. Кроме того, если стоимость размещения объекта в пуле памяти очень мала (например, требуется только атомарный обмен указателя), виртуальная машина Java, вероятно, не будет поддерживать для этого пула порог использования, поскольку накладные расходы на сравнение использования с порогом превышают стоимость размещения объекта.
Использование памяти системой можно отслеживать с помощью механизмов опроса или уведомлений о пороговом значении.
-
Опрос
Приложение может непрерывно отслеживать использование памяти, вызывая для всех пулов памяти метод
getUsage()или для пулов памяти, поддерживающих порог использования, методisUsageThresholdExceeded(). Ниже приведен пример кода, в котором имеется поток, предназначенный для распределения и обработки задач. Через каждый интервал он определяет, следует ли принимать и обрабатывать новые задачи, исходя из использования памяти. Если использование памяти превышает порог, поток распределяет все ожидающие задачи между другими ВМ и прекращает принимать новые задачи, пока использование памяти не опустится ниже порога.// Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); .... boolean lowMemory = false; while (true) { if (pool.isUsageThresholdExceeded()) { // potential low memory, so redistribute tasks to other VMs lowMemory = true; redistributeTasks(); // stop receiving new tasks stopReceivingTasks(); } else { if (lowMemory) { // resume receiving tasks lowMemory = false; resumeReceivingTasks(); } // processing outstanding task ... } // sleep for sometime try { Thread.sleep(sometime); } catch (InterruptedException e) { ... } }Приведенный выше пример не различает ситуацию, когда использование памяти временно опустилось ниже порога, и ситуацию, когда в течение двух итераций оно остается выше порога. Счетчик превышений порога использования, возвращаемый методомgetUsageThresholdCount(), можно использовать, чтобы определить, опускалось ли использование памяти ниже порога между двумя опросами.Ниже приведен другой пример: он выполняет действие, если в пуле памяти недостаточно свободной памяти, и игнорирует изменения использования памяти во время выполнения этого действия.
// Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold which determines if // the application will take some action under low memory condition. pool.setUsageThreshold(myThreshold); int prevCrossingCount = 0; while (true) { // A busy loop to detect when the memory usage // has exceeded the threshold. while (!pool.isUsageThresholdExceeded() || pool.getUsageThresholdCount() == prevCrossingCount) { try { Thread.sleep(sometime) } catch (InterruptException e) { .... } } // Do some processing such as check for memory usage // and issue a warning .... // Gets the current threshold count. The busy loop will then // ignore any crossing of threshold happens during the processing. prevCrossingCount = pool.getUsageThresholdCount(); } -
Уведомления о превышении порога использования
Уведомления о превышении порога использования отправляются объектом
MemoryMXBean. Когда виртуальная машина Java обнаруживает, что использование памяти в пуле достигло порога использования или превысило его, виртуальная машина инициируетMemoryMXBeanдля отправки уведомленияusage threshold exceeded notification. Следующее уведомление о превышении порога использования будет отправлено только после того, как использование опустится ниже порога, а затем снова превысит его.Ниже приведен пример кода, реализующий ту же логику, что и первый пример, но использующий механизм уведомлений о превышении порога использования для обнаружения нехватки памяти вместо опроса. В этом примере после получения уведомления слушатель уведомлений оповещает другой поток, который выполняет фактическое действие, например перераспределяет ожидающие задачи, прекращает прием задач или возобновляет его. Метод
handleNotificationдолжен выполнять как можно меньше работы и возвращаться без задержки, чтобы не задерживать доставку последующих уведомлений. Длительные действия следует выполнять в отдельном потоке. Слушатель уведомлений может вызываться несколькими потоками одновременно; поэтому действия, выполняемые слушателем, должны быть надлежащим образом синхронизированы.class MyListener implements javax.management.NotificationListener { public void handleNotification(Notification notification, Object handback) { String notifType = notification.getType(); if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) { // potential low memory, notify another thread // to redistribute outstanding tasks to other VMs // and stop receiving new tasks. lowMemory = true; notifyAnotherThread(lowMemory); } } } // Register MyListener with MemoryMXBean MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); NotificationEmitter emitter = (NotificationEmitter) mbean; MyListener listener = new MyListener(); emitter.addNotificationListener(listener, null, null); // Assume this pool supports a usage threshold. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); // Usage threshold detection is enabled and notification will be // handled by MyListener. Continue for other processing. ....Нет гарантии, когда
MemoryMXBeanотправит уведомление о превышении порога и когда это уведомление будет доставлено. Когда вызывается слушатель уведомлений, использование памяти в пуле могло пересечь порог использования несколько раз. МетодMemoryNotificationInfo.getCount()возвращает число пересечений порога использования на момент формирования уведомления. Это значение можно сравнить с текущим счетчиком превышений порога использования, возвращаемым методомgetUsageThresholdCount(), чтобы определить, возникла ли такая ситуация.
4. Порог использования после сборки мусора
Порог использования после сборки мусора — это управляемый атрибут, применимый только к некоторым пулам памяти со сборкой мусора. После того как виртуальная машина Java приложила усилия для освобождения пространства в пуле памяти путем повторного использования памяти, занятой неиспользуемыми объектами во время сборки мусора, некоторое количество байтов в пулах памяти, в которых выполняется сборка мусора, все еще будет занято. Порог использования после сборки мусора позволяет задать значение для этого количества байтов; если оно превышено, объектMemoryMXBean отправит уведомление collection usage threshold exceeded notification. Кроме того, счетчик collection usage threshold count будет увеличен. Метод isCollectionUsageThresholdSupported() позволяет определить, поддерживается ли эта функция.
Виртуальная машина Java проверяет порог использования после сборки мусора для каждого пула памяти. Проверка включается, если порог использования после сборки мусора задан положительным значением. Если порог использования после сборки мусора равен нулю, проверка для этого пула памяти отключается. Значение по умолчанию — ноль. Виртуальная машина Java проверяет порог использования после сборки мусора во время сборки мусора.
Некоторые пулы памяти со сборкой мусора могут не поддерживать порог использования после сборки мусора. Например, пул памяти может управляться только непрерывным конкурентным сборщиком мусора. Поток может размещать объекты в этом пуле памяти, одновременно с тем как конкурентный сборщик мусора освобождает память, занятую неиспользуемыми объектами. Если не существует четко определенного момента сборки мусора, наиболее подходящего для проверки использования памяти, поддерживать порог использования после сборки мусора не следует.
Порог использования после сборки мусора предназначен для мониторинга использования памяти после того, как виртуальная машина Java приложила усилия для освобождения пространства. Использование памяти после сборки мусора также можно аналогичным образом отслеживать с помощью механизмов опроса и уведомлений о пороговом значении, описанных выше для порога использования.
- Начиная с версии:
- 1.5
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MemoryUsage |
getCollectionUsage() |
Возвращает использование памяти после того, как виртуальная машина Java в последний раз приложила усилия для повторного использования памяти, занятой неиспользуемыми объектами в этом пуле памяти. |
long |
getCollectionUsageThreshold() |
Возвращает порог использования после сборки мусора для этого пула памяти в байтах. |
long |
getCollectionUsageThresholdCount() |
Возвращает число случаев, когда виртуальная машина Java обнаруживала, что использование памяти достигло порога использования после сборки мусора или превысило его. |
String[] |
getMemoryManagerNames() |
Возвращает имена диспетчеров памяти, управляющих этим пулом памяти. |
String |
getName() |
Возвращает имя, обозначающее этот пул памяти. |
MemoryUsage |
getPeakUsage() |
Возвращает пиковое использование памяти этим пулом с момента запуска виртуальной машины Java или сброса пикового значения. |
MemoryType |
getType() |
Возвращает тип этого пула памяти. |
MemoryUsage |
getUsage() |
Возвращает оценку использования памяти этим пулом памяти. |
long |
getUsageThreshold() |
Возвращает порог использования для этого пула памяти в байтах. |
long |
getUsageThresholdCount() |
Возвращает число случаев, когда использование памяти пересекало порог использования. |
boolean |
isCollectionUsageThresholdExceeded() |
Проверяет, достигло ли использование памяти этим пулом после последней сборки мусора, на которую виртуальная машина Java затратила усилия, порога использования после сборки мусора или превысило ли его. |
boolean |
isCollectionUsageThresholdSupported() |
Проверяет, поддерживает ли этот пул памяти порог использования после сборки мусора. |
boolean |
isUsageThresholdExceeded() |
Проверяет, достигает ли использование памяти этим пулом памяти порогового значения использования или превышает ли его. |
boolean |
isUsageThresholdSupported() |
Проверяет, поддерживает ли этот пул памяти порог использования. |
boolean |
isValid() |
Проверяет, является ли этот пул памяти действительным в виртуальной машине Java. |
void |
resetPeakUsage() |
Сбрасывает статистику пикового использования памяти этого пула до текущего использования памяти. |
void |
setCollectionUsageThreshold |
Задает для порога использования после сборки мусора этого пула памяти указанное значение threshold. |
void |
setUsageThreshold |
Задает порог для этого пула памяти равным указанному значению threshold, если пул памяти поддерживает порог использования. |
Методы, объявленные в интерфейсе PlatformManagedObject
getObjectName
Подробное описание методов
getName
String getName()
- Возвращает:
- имя этого пула памяти.
getType
MemoryType getType()
Доступ через MBeanServer:
Сопоставленный тип MemoryType — String, а значение — имя MemoryType.
- Возвращает:
- тип этого пула памяти.
getUsage
MemoryUsage getUsage()
null, если пул памяти недействителен (то есть больше не существует). Этот метод запрашивает у виртуальной машины Java наиболее точную из возможных оценку текущего использования памяти этим пулом. Для некоторых пулов памяти этот метод может быть затратной операцией, требующей вычислений для определения оценки. Реализация должна документировать такие случаи.
Этот метод предназначен для мониторинга использования системной памяти и обнаружения нехватки памяти.
Доступ через MBeanServer:
Сопоставленный тип MemoryUsage — CompositeData с атрибутами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsageилиnull, если этот пул недействителен.
getPeakUsage
MemoryUsage getPeakUsage()
null, если пул памяти недействителен (то есть больше не существует). Доступ через MBeanServer:
Сопоставленный тип MemoryUsage — CompositeData с атрибутами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsage, представляющий пиковое использование памяти, илиnull, если этот пул недействителен.
resetPeakUsage
void resetPeakUsage()
isValid
boolean isValid()
- Возвращает:
-
true, если пул памяти действителен в работающей виртуальной машине Java; в противном случае —false.
getMemoryManagerNames
String[] getMemoryManagerNames()
- Возвращает:
- массив объектов
String, каждый из которых содержит имя диспетчера памяти, управляющего этим пулом памяти.
getUsageThreshold
long getUsageThreshold()
setUsageThreshold.- Возвращает:
- порог использования этого пула памяти в байтах.
- Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования. - См. также:
setUsageThreshold
void setUsageThreshold(long threshold)
threshold, если пул памяти поддерживает порог использования. Проверка превышения порога использования в этом пуле памяти включается, если порог задан положительным значением. Если порог равен нулю, проверка превышения порога использования отключается.- Параметры:
-
threshold— новое значение порога в байтах. Должно быть неотрицательным. - Вызывает исключение:
-
IllegalArgumentException— еслиthresholdотрицательно или, если максимальный объем памяти для этого пула определен, превышает его. -
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования. - См. также:
isUsageThresholdExceeded
boolean isUsageThresholdExceeded()
- Возвращает:
-
true, если использование памяти этим пулом достигает порогового значения или превышает его; в противном случае —false. - Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования.
getUsageThresholdCount
long getUsageThresholdCount()
- Возвращает:
- число случаев, когда использование памяти пересекало пороговое значение использования.
- Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования.
isUsageThresholdSupported
boolean isUsageThresholdSupported()
- Возвращает:
-
true, если этот пул памяти поддерживает порог использования; в противном случае —false.
getCollectionUsageThreshold
long getCollectionUsageThreshold()
setCollectionUsageThreshold.- Возвращает:
- порог использования после сборки мусора для этого пула памяти в байтах.
- Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования после сборки мусора. - См. также:
setCollectionUsageThreshold
void setCollectionUsageThreshold(long threshold)
threshold. Если для порога задано положительное значение, виртуальная машина Java проверит использование памяти в наиболее подходящий момент после того, как приложит усилия для повторного использования памяти, занятой неиспользуемыми объектами в этом пуле памяти. Проверка превышения порога использования после сборки мусора в этом пуле памяти включается, если порог задан положительным значением. Если порог равен нулю, проверка превышения порога использования после сборки мусора отключается.
- Параметры:
-
threshold— новое значение порога использования после сборки мусора в байтах. Должно быть неотрицательным. - Вызывает исключение:
-
IllegalArgumentException— еслиthresholdотрицательно или, если максимальный объем памяти для этого пула определен, превышает его. -
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования после сборки мусора. - См. также:
isCollectionUsageThresholdExceeded
boolean isCollectionUsageThresholdExceeded()
- Возвращает:
-
true, если при последней сборке мусора использование памяти этим пулом достигло порогового значения использования после сборки мусора или превысило его; в противном случае —false. - Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования.
getCollectionUsageThresholdCount
long getCollectionUsageThresholdCount()
- Возвращает:
- число случаев, когда использование памяти достигало порога использования после сборки мусора или превышало его.
- Вызывает исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования после сборки мусора. - См. также:
getCollectionUsage
MemoryUsage getCollectionUsage()
null, если виртуальная машина Java не поддерживает его. Доступ через MBeanServer:
Сопоставленный тип MemoryUsage — CompositeData с атрибутами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsage, представляющий использование памяти этим пулом после того, как виртуальная машина Java в последний раз приложила усилия для повторного использования памяти, занятой неиспользуемыми объектами;null, если этот метод не поддерживается.
isCollectionUsageThresholdSupported
boolean isCollectionUsageThresholdSupported()
- Возвращает:
-
true, если этот пул памяти поддерживает порог использования после сборки мусора; в противном случае —false.
© 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/MemoryPoolMXBean.html