Интерфейс 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, вероятно, не будет поддерживать пороговое значение использования для этого пула памяти, так как накладные расходы на сравнение использования с порогом выше, чем стоимость выделения объекта.
Использование памяти системы можно отслеживать с помощью механизмов опроса или уведомлений о превышении порога.
-
Опрос
Приложение может непрерывно отслеживать использование памяти, вызывая либо метод
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
- См. также:
-
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) Устанавливает пороговое значение использования коллекции этого пула памяти на указанное значение |
void |
setUsageThreshold(long 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.