Интерфейс 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 приложила усилия к освобождению места в памяти путем переработки неиспользуемых объектов в пуле памяти во время сборки мусора, некоторое количество байтов в пулах памяти, которые были собраны мусором, все еще будут использоваться. Пороговое значение использования при сборке мусора позволяет установить значение для этого количества байтов, так что если порог превышен,collection usage threshold exceeded notification будет выпущен MemoryMXBean. Кроме того, collection usage threshold count затем будет увеличен. Метод isCollectionUsageThresholdSupported() можно использовать для определения поддержки этой функциональности.
Виртуальная машина Java выполняет проверку порогового значения использования при сборке мусора для каждого пула памяти. Эта проверка включена, если пороговое значение использования при сборке мусора установлено в положительное значение. Если пороговое значение использования при сборке мусора установлено в ноль, эта проверка отключена для этого пула памяти. Значение по умолчанию равно нулю. Виртуальная машина Java выполняет проверку порогового значения использования при сборке мусора во время сборки мусора.
Некоторые пулы памяти со сборкой мусора могут выбрать не поддерживать пороговое значение использования при сборке мусора. Например, пул памяти управляется только непрерывным конкурентным сборщиком мусора. Объекты могут быть выделены в этом пуле памяти каким-то потоком, в то время как неиспользуемые объекты одновременно удаляются конкурентным сборщиком мусора. Если нет четко определенного времени сборки мусора, которое является наиболее подходящим временем для проверки использования памяти, пороговое значение использования при сборке мусора не должно поддерживаться.
Пороговое значение использования при сборке мусора предназначено для отслеживания использования памяти после того, как виртуальная машина Java приложила усилия для освобождения места в памяти. Использование при сборке мусора также можно отслеживать с помощью механизмов опроса и уведомления о пороге, описанных выше для порогового значения использования, аналогичным образом.
- Since:
- 1.5
- See Also:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MemoryUsage |
getCollectionUsage() |
Возвращает использование памяти после последнего цикла сбора мусора в этом пуле памяти. |
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 значение, если этот пул памяти поддерживает пороговое значение использования. |
Методы, объявленные в интерфейсе 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()
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.
- Возвращает:
- a
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://download.java.net/java/early_access/jdk24/docs/api/java.management/java/lang/management/MemoryPoolMXBean.html