Spec-Zone.ru › OpenJDK 25

Интерфейс MemoryPoolMXBean

Все супер-интерфейсы:
PlatformManagedObject
public interface MemoryPoolMXBean extends PlatformManagedObject
Интерфейс управления пулом памяти. Пул памяти представляет ресурс памяти, управляемый виртуальной машиной Java, и управляется одним или несколькими memory managers.

Виртуальная машина Java имеет один или несколько экземпляров класса реализации этого интерфейса. Экземпляр, реализующий этот интерфейс, является MXBean, который можно получить, вызвав метод ManagementFactory.getMemoryPoolMXBeans() или из метода platform MBeanServer.

ObjectName для уникальной идентификации MXBean пула памяти в пределах MBeanServer имеет вид:

java.lang:type=MemoryPool,name=имя пула
Его можно получить, вызвав метод PlatformManagedObject.getObjectName().

Тип памяти

Виртуальная машина Java использует кучу для размещения объектов, а также поддерживает память вне кучи для области методов и выполнения виртуальной машины Java. Виртуальная машина Java может иметь один или несколько пулов памяти. Каждый пул памяти представляет область памяти одного из следующих типов:

  • heap
  • non-heap

Мониторинг использования памяти

Пул памяти имеет следующие атрибуты:
  • Использование памяти
  • Пиковое использование памяти
  • Порог использования
  • Порог использования после сборки мусора (поддерживается только некоторыми пулами памяти со сборкой мусора)

1. Использование памяти

Метод getUsage() возвращает оценку текущего использования пула памяти. Для пула памяти со сборкой мусора объем используемой памяти включает память, занятую всеми объектами в пуле, как достижимыми, так и недостижимыми.

В целом этот метод представляет собой легковесную операцию для получения приблизительного значения использования памяти. Для некоторых пулов памяти, например когда объекты расположены непоследовательно, вызов этого метода может быть затратной операцией, требующей вычислений для определения текущего использования памяти. Реализация должна документировать такие случаи.

2. Пиковое использование памяти

Виртуальная машина Java поддерживает пиковое использование памяти пула с момента запуска виртуальной машины или сброса пикового значения. Пиковое использование памяти возвращается методом getPeakUsage() и сбрасывается вызовом метода resetPeakUsage().

3. Порог использования

У каждого пула памяти есть управляемый атрибут, называемый порогом использования, значение по умолчанию для которого задается виртуальной машиной Java. Значение по умолчанию зависит от платформы. Порог использования можно задать с помощью метода setUsageThreshold. Если порог задан положительным значением, в этом пуле памяти включается проверка превышения порога использования. Если порог использования равен нулю, проверка превышения порога использования для этого пула памяти отключается. Метод isUsageThresholdSupported() позволяет определить, поддерживается ли эта функция.

Виртуальная машина Java проверяет превышение порога использования для каждого пула памяти в наиболее подходящий момент, обычно во время сборки мусора. Каждый пул памяти поддерживает счетчик usage threshold count, который увеличивается каждый раз, когда виртуальная машина Java обнаруживает превышение порога использования памяти в пуле.

Этот управляемый атрибут порога использования предназначен для мониторинга тенденции роста использования памяти с небольшими накладными расходами. Для некоторых пулов памяти порог использования может быть неприменим. Например, поколенческий сборщик мусора — распространенный алгоритм сборки мусора, используемый во многих реализациях виртуальной машины Java, — управляет двумя или более поколениями, разделяя объекты по возрасту. Большинство объектов размещается в самом молодом поколении (например, в пуле памяти молодого поколения). Пул памяти молодого поколения рассчитан на заполнение, а его сборка мусора освобождает большую часть пространства, поскольку предполагается, что он содержит главным образом короткоживущие объекты, которые в основном недостижимы во время сборки мусора. В этом случае порог использования для пула памяти молодого поколения поддерживать нецелесообразно. Кроме того, если стоимость размещения объекта в пуле памяти очень мала (например, требуется только атомарный обмен указателя), виртуальная машина Java, вероятно, не будет поддерживать для этого пула порог использования, поскольку накладные расходы на сравнение использования с порогом превышают стоимость размещения объекта.

Использование памяти системой можно отслеживать с помощью механизмов опроса или уведомлений о пороговом значении.

  1. Опрос

    Приложение может непрерывно отслеживать использование памяти, вызывая для всех пулов памяти метод 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();
          }
          
  2. Уведомления о превышении порога использования

    Уведомления о превышении порога использования отправляются объектом 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
См. также:
  • ManagementFactory.getPlatformMXBeans(Class)
  • Спецификация JMX.
  • Способы доступа к MXBeans

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

Модификатор и тип Метод Описание
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(long threshold)
Задает для порога использования после сборки мусора этого пула памяти указанное значение threshold.
void setUsageThreshold(long threshold)
Задает порог для этого пула памяти равным указанному значению 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()
Возвращает пиковое использование памяти этим пулом с момента запуска виртуальной машины Java или сброса пикового значения. Этот метод возвращает null, если пул памяти недействителен (то есть больше не существует).

Доступ через MBeanServer:
Сопоставленный тип MemoryUsage — CompositeData с атрибутами, указанными в MemoryUsage.

Возвращает:
объект MemoryUsage, представляющий пиковое использование памяти, или null, если этот пул недействителен.

resetPeakUsage

void resetPeakUsage()
Сбрасывает статистику пикового использования памяти этого пула до текущего использования памяти.

isValid

boolean isValid()
Проверяет, является ли этот пул памяти действительным в виртуальной машине Java. Пул памяти становится недействительным после того, как виртуальная машина Java удаляет его из системы памяти.
Возвращает:
true, если пул памяти действителен в работающей виртуальной машине Java; в противном случае — false.

getMemoryManagerNames

String[] getMemoryManagerNames()
Возвращает имена диспетчеров памяти, управляющих этим пулом памяти. Каждый пул памяти управляется как минимум одним диспетчером памяти.
Возвращает:
массив объектов String, каждый из которых содержит имя диспетчера памяти, управляющего этим пулом памяти.

getUsageThreshold

long getUsageThreshold()
Возвращает порог использования для этого пула памяти в байтах. Для каждого пула памяти задается зависящее от платформы значение порога по умолчанию. Текущий порог использования можно изменить с помощью метода setUsageThreshold.
Возвращает:
порог использования этого пула памяти в байтах.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования.
См. также:
  • isUsageThresholdSupported()

setUsageThreshold

void setUsageThreshold(long threshold)
Задает порог для этого пула памяти равным указанному значению threshold, если пул памяти поддерживает порог использования. Проверка превышения порога использования в этом пуле памяти включается, если порог задан положительным значением. Если порог равен нулю, проверка превышения порога использования отключается.
Параметры:
threshold — новое значение порога в байтах. Должно быть неотрицательным.
Вызывает исключение:
IllegalArgumentException — если threshold отрицательно или, если максимальный объем памяти для этого пула определен, превышает его.
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования.
См. также:
  • isUsageThresholdSupported()
  • Порог использования

isUsageThresholdExceeded

boolean isUsageThresholdExceeded()
Проверяет, достигает ли использование памяти этим пулом памяти порогового значения использования или превышает ли его.
Возвращает:
true, если использование памяти этим пулом достигает порогового значения или превышает его; в противном случае — false.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования.

getUsageThresholdCount

long getUsageThresholdCount()
Возвращает число случаев, когда использование памяти пересекало порог использования.
Возвращает:
число случаев, когда использование памяти пересекало пороговое значение использования.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования.

isUsageThresholdSupported

boolean isUsageThresholdSupported()
Проверяет, поддерживает ли этот пул памяти порог использования.
Возвращает:
true, если этот пул памяти поддерживает порог использования; в противном случае — false.

getCollectionUsageThreshold

long getCollectionUsageThreshold()
Возвращает порог использования после сборки мусора для этого пула памяти в байтах. Значение по умолчанию — ноль. Порог использования после сборки мусора можно изменить с помощью метода setCollectionUsageThreshold.
Возвращает:
порог использования после сборки мусора для этого пула памяти в байтах.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования после сборки мусора.
См. также:
  • isCollectionUsageThresholdSupported()

setCollectionUsageThreshold

void setCollectionUsageThreshold(long threshold)
Задает для порога использования после сборки мусора этого пула памяти указанное значение threshold. Если для порога задано положительное значение, виртуальная машина Java проверит использование памяти в наиболее подходящий момент после того, как приложит усилия для повторного использования памяти, занятой неиспользуемыми объектами в этом пуле памяти.

Проверка превышения порога использования после сборки мусора в этом пуле памяти включается, если порог задан положительным значением. Если порог равен нулю, проверка превышения порога использования после сборки мусора отключается.

Параметры:
threshold — новое значение порога использования после сборки мусора в байтах. Должно быть неотрицательным.
Вызывает исключение:
IllegalArgumentException — если threshold отрицательно или, если максимальный объем памяти для этого пула определен, превышает его.
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования после сборки мусора.
См. также:
  • isCollectionUsageThresholdSupported()
  • Порог использования после сборки мусора

isCollectionUsageThresholdExceeded

boolean isCollectionUsageThresholdExceeded()
Проверяет, достигло ли использование памяти этим пулом после последней сборки мусора, на которую виртуальная машина Java затратила усилия, порога использования после сборки мусора или превысило ли его. Этот метод не запрашивает у виртуальной машины Java выполнение сборки мусора, кроме обычного автоматического управления памятью.
Возвращает:
true, если при последней сборке мусора использование памяти этим пулом достигло порогового значения использования после сборки мусора или превысило его; в противном случае — false.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования.

getCollectionUsageThresholdCount

long getCollectionUsageThresholdCount()
Возвращает число случаев, когда виртуальная машина Java обнаруживала, что использование памяти достигло порога использования после сборки мусора или превысило его.
Возвращает:
число случаев, когда использование памяти достигало порога использования после сборки мусора или превышало его.
Вызывает исключение:
UnsupportedOperationException — если этот пул памяти не поддерживает порог использования после сборки мусора.
См. также:
  • isCollectionUsageThresholdSupported()

getCollectionUsage

MemoryUsage getCollectionUsage()
Возвращает использование памяти после того, как виртуальная машина Java в последний раз приложила усилия для повторного использования памяти, занятой неиспользуемыми объектами в этом пуле памяти. Этот метод не запрашивает у виртуальной машины Java выполнение сборки мусора, кроме обычного автоматического управления памятью. Этот метод возвращает null, если виртуальная машина Java не поддерживает его.

Доступ через MBeanServer:
Сопоставленный тип MemoryUsage — CompositeData с атрибутами, указанными в MemoryUsage.

Возвращает:
объект MemoryUsage, представляющий использование памяти этим пулом после того, как виртуальная машина Java в последний раз приложила усилия для повторного использования памяти, занятой неиспользуемыми объектами; null, если этот метод не поддерживается.

isCollectionUsageThresholdSupported

boolean isCollectionUsageThresholdSupported()
Проверяет, поддерживает ли этот пул памяти порог использования после сборки мусора.
Возвращает:
true, если этот пул памяти поддерживает порог использования после сборки мусора; в противном случае — false.

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по 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/MemoryPoolMXBean.html

Spec-Zone.ru

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