Интерфейс 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 приложила усилия для возвращения места в памяти. Использование при сборе также можно отслеживать с помощью механизмов опроса и уведомления о пороге, описанных выше для порогового значения использования в аналогичной манере.
- С:
- 1.5
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MemoryUsage |
getCollectionUsage() |
Возвращает использование памяти после того, как виртуальная машина Java недавно приложила усилия к переработке неиспользуемых объектов в этом пуле памяти. |
long |
getCollectionUsageThreshold() |
Возвращает пороговое значение использования коллекции этого пула памяти в байтах. |
long |
getCollectionUsageThresholdCount() |
Возвращает количество раз, когда виртуальная машина Java определила, что использование памяти достигло или превысило пороговое значение использования коллекции. |
String[] |
getMemoryManagerNames() |
Возвращает имя менеджеров памяти, которые управляют этим пулом памяти. |
String |
getName() |
Возвращает имя, представляющее этот пул памяти. |
MemoryUsage |
getPeakUsage() |
Возвращает максимальное использование памяти этого пула памяти с момента запуска виртуальной машины Java или с момента сброса максимума. |
MemoryType |
getType() |
Возвращает тип этого пула памяти. |
MemoryUsage |
getUsage() |
Возвращает оценку использования памяти этим пулом памяти. |
long |
getUsageThreshold() |
Возвращает значение порога использования этого пула памяти в байтах. |
long |
getUsageThresholdCount() |
Возвращает количество раз, когда использование памяти пересекло пороговое значение использования. |
boolean |
isCollectionUsageThresholdExceeded() |
Проверяет, достигло ли использование памяти этим пулом памяти после последней коллекции, над которой виртуальная машина Java приложила усилия, или превысило пороговое значение использования коллекции. |
boolean |
isCollectionUsageThresholdSupported() |
Проверяет, поддерживает ли этот пул памяти пороговое значение использования коллекции. |
boolean |
isUsageThresholdExceeded() |
Проверяет, достигает ли использование памяти этим пулом памяти или превышает его значение порога использования. |
boolean |
isUsageThresholdSupported() |
Проверяет, поддерживает ли этот пул памяти порог использования. |
boolean |
isValid() |
Проверяет, является ли этот пул памяти допустимым в виртуальной машине Java. |
void |
resetPeakUsage() |
Сбрасывает статистику максимального использования памяти этого пула памяти до текущего использования памяти. |
void |
setCollectionUsageThreshold |
Устанавливает пороговое значение использования коллекции этого пула памяти на заданное значение threshold. |
void |
setUsageThreshold |
Устанавливает порог этого пула памяти на заданное значение threshold, если этот пул памяти поддерживает порог использования. |
Методы, объявленные в интерфейсе 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()
- Исключение:
-
SecurityException— если существует менеджер безопасности, и у вызывающего объекта нет разрешения ManagementPermission("control").
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— если этот пул памяти не поддерживает порог использования. -
SecurityException— если существует менеджер безопасности, и у вызывающего объекта нет разрешения ManagementPermission("control"). - См. также:
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— если этот пул памяти не поддерживает порог сбора использования. -
SecurityException— если существует менеджер безопасности, и у вызывающего объекта нет разрешения ManagementPermission("control"). - См. также:
isCollectionUsageThresholdExceeded
boolean isCollectionUsageThresholdExceeded()
- Возвращает:
-
trueесли использование памяти этим пулом памяти достигло или превысило значение порога сбора использования в последнем сборе;falseв противном случае. - Исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог использования.
getCollectionUsageThresholdCount
long getCollectionUsageThresholdCount()
- Возвращает:
- количество раз, когда использование памяти достигло или превысило порог сбора использования.
- Исключение:
-
UnsupportedOperationException— если этот пул памяти не поддерживает порог сбора использования. - См. также:
getCollectionUsage
MemoryUsage getCollectionUsage()
null если виртуальная машина Java не поддерживает этот метод. Доступ к MBeanServer:
Картируемый тип MemoryUsage - это CompositeData со свойствами, указанными в MemoryUsage.
- Возвращает:
- объект
MemoryUsage, представляющий использование памяти в этом пуле памяти после того, как виртуальная машина Java в последний раз приложила усилия к рециклированию неиспользуемых объектов;nullесли этот метод не поддерживается.
isCollectionUsageThresholdSupported
boolean isCollectionUsageThresholdSupported()
- Возвращает:
-
trueесли этот пул памяти поддерживает порог использования сбора;falseв противном случае.
© 1993, 2023, 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/21/docs/api/java.management/java/lang/management/MemoryPoolMXBean.html