Spec-Zone.ru › OpenJDK 17

Интерфейс 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, управляет двумя или более поколениями, разделяя объекты по возрасту. Большинство объектов выделяются в самом молодом поколении (например, в пуле памяти nursery). Пул памяти nursery предназначен для заполнения, а сборка пула памяти nursery освободит большую часть его памяти, поскольку ожидается, что он содержит в основном кратковременные объекты, которые, в основном, недостижимы во время сбора мусора. В этом случае для пула памяти nursery более целесообразно не поддерживать порог использования. Кроме того, если стоимость выделения объекта в одном пуле памяти очень низкая (например, просто атомная замена указателя), виртуальная машина 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 приложила усилия для освобождения памяти путем рециклинга неиспользуемых объектов в пуле памяти во время сбора мусора, некоторое количество байтов в пулах памяти, которые были собраны, все еще будут использоваться. Пороговое значение использования при сборе позволяет установить значение для этого количества байтов таким образом, что если порог превышен, collection usage threshold exceeded notification будет выпущен MemoryMXBean. Кроме того, collection usage threshold count затем будет увеличен.

Метод isCollectionUsageThresholdSupported() можно использовать для определения поддержки этой функциональности.

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

Некоторые пулы памяти со сборкой мусора могут отказаться от поддержки порога использования при сборе. Например, пул памяти управляется только непрерывным конкурирующим сборщиком мусора. Объекты могут быть выделены в этом пуле памяти каким-то потоком, в то время как неиспользуемые объекты одновременно собираются конкурирующим сборщиком мусора. Если нет четко определенного времени сбора мусора, которое является лучшим подходящим временем для проверки использования памяти, порог использования при сборе не должен поддерживаться.

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

С:
1.5
См. также:
  • ManagementFactory.getPlatformMXBeans(Class)
  • Спецификация JMX.
  • Способы доступа к MXBean

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

Модификатор и тип Метод Описание
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, если этот пул памяти поддерживает порог использования.

Методы, объявленные в интерфейсе java.lang.management.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()
Сбрасывает статистику максимального использования памяти этого пула памяти до текущего использования памяти.
Исключение:
SecurityException — если существует менеджер безопасности и у вызывающего объекта нет разрешения ManagementPermission("control").

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 - если этот пул памяти не поддерживает порог использования.
SecurityException - если существует менеджер безопасности и у вызывающего объекта нет разрешения ManagementPermission("control").
См. также:
  • 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 - если этот пул памяти не поддерживает порог сбора использования.
SecurityException - если существует менеджер безопасности и у вызывающего объекта нет разрешения ManagementPermission("control").
См. также:
  • 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 в противном случае.

© 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/MemoryPoolMXBean.html

Spec-Zone.ru

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