Интерфейс MemoryPoolMXBean

Все суперинтерфейсы:
PlatformManagedObject
public interface MemoryPoolMXBean
extends PlatformManagedObject

Управление интерфейсом для пула памяти. Пул памяти представляет собой управляемый ресурс памяти виртуальной машиной Java и управляется одним или несколькими memory managers.

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

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

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

Тип памяти

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

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

Пул памяти имеет следующие атрибуты:

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 приложила усилия по освобождению места в памяти, перерабатывая неиспользуемые объекты в пуле памяти во время сбора мусора, некоторое количество байтов в пулах памяти, которые собирались, всё ещё будут использоваться. Пороговое значение использования для сбора позволяет установить значение для этого количества байтов, так что если порог превышен, 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, 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/MemoryPoolMXBean.html

Spec-Zone .ru
спецификации, руководства, описания, API