Spec-Zone .ru
спецификации, руководства, описания, API
|
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 могут быть один или более пулов памяти. Каждый пул памяти представляет область памяти одного из следующих типов:
getUsage()
метод обеспечивает оценку текущего использования пула памяти. Для собранного "мусор" пула памяти количество используемой памяти включает память, занятую всеми объектами в пуле и включая достижимые и включая недостижимые объекты. Вообще, этот метод является легкой работой для того, чтобы получить приблизительное использование памяти. Для некоторых пулов памяти, например, когда объекты не упаковываются рядом, этот метод может быть дорогой работой, которая требует, чтобы некоторое вычисление определило текущее использование памяти. Реализация должна задокументировать когда дело обстоит так.
getPeakUsage()
метод и сброс, вызывая resetPeakUsage()
метод. setUsageThreshold
метод. Если порог устанавливается к положительному значению, пороговая проверка пересечения использования включается в этом пуле памяти. Если порог использования обнуляется, пороговое пересечение использования, проверяющее этот пул памяти, отключается. isUsageThresholdSupported()
метод может использоваться, чтобы определить, поддерживается ли эта функциональность. Виртуальная машина Java выполняет пороговое пересечение использования, проверяющее основание пула памяти в его лучшее подходящее время, обычно, во время сборки "мусора". Каждый пул памяти поддерживает a usage threshold count
это будет постепенно увеличено каждый раз, когда виртуальная машина Java обнаружит, что использование пула памяти пересекает порог.
Этот управляемый пороговый атрибут использования разрабатывается для того, чтобы контролировать увеличивающуюся тенденцию использования памяти с низкими издержками. Порог использования, возможно, не является подходящим для некоторых пулов памяти. Например, generational сборщик "мусора", общий алгоритм сборки "мусора", используемый во многих реализациях виртуальной машины Java, управляет двумя или больше поколениями, выделяющими объекты возрастом. Большинство объектов выделяется в самой молодой генерации (скажите детский пул памяти). Детский пул памяти разрабатывается, чтобы быть заполненным, и сбор детского пула памяти освободит большую часть своего места в памяти, так как это, как ожидают, будет содержать главным образом недолгие объекты и главным образом недостижимо во время сборки "мусора". В этом случае для детского пула памяти более уместно не поддерживать порог использования. Кроме того, если стоимость объектного выделения в одном пуле памяти очень низка (например, только атомарный обмен указателя), виртуальная машина Java, вероятно, не поддерживала бы порог использования для того пула памяти, так как издержки в сравнении использования с порогом выше чем стоимость объектного выделения.
Использование памяти системы может контролироваться, используя опрос или пороговые механизмы уведомления.
Приложение может непрерывно контролировать свое использование памяти, вызывая любого getUsage()
метод для всех пулов памяти или isUsageThresholdExceeded()
метод для тех пулов памяти, которые поддерживают порог использования. Ниже пример кода, у которого есть поток delicated для распределения задачи и обработки. В каждом интервале это определит, должно ли это получить и обработать новые задачи, основанные на его использовании памяти. Если использование памяти превысит свой порог использования, то оно перераспределит все выдающиеся задачи к другому VMs и прекратит получать новые задачи до возвратов использования памяти ниже его порога использования.
// 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()
метод, чтобы определить, произошла ли такая ситуация.
collection usage threshold exceeded notification
будет испускаться MemoryMXBean
. Кроме того, collection usage threshold count
будет тогда постепенно увеличен. isCollectionUsageThresholdSupported()
метод может использоваться, чтобы определить, поддерживается ли эта функциональность.
Виртуальная машина Java выполняет порог использования набора, проверяющий основание пула памяти. Эта проверка включается, если порог использования набора устанавливается к положительному значению. Если порог использования набора обнуляется, эта проверка отключается на этом пуле памяти. Значение по умолчанию является нулем. Во время сборки "мусора" виртуальная машина Java выполняет пороговую проверку использования набора.
Некоторые собрали "мусор", пулы памяти могут хотеть не поддерживать порог использования набора. Например, пулом памяти только управляет непрерывный параллельный сборщик "мусора". Объекты могут быть выделены в этом пуле памяти некоторым потоком, в то время как неиспользованные объекты исправляются параллельным сборщиком "мусора" одновременно. Если нет четко определенное время сборки "мусора", которое является лучшим подходящим временем, чтобы проверить использование памяти, порог использования набора не должен поддерживаться.
Порог использования набора разрабатывается для того, чтобы контролировать использование памяти после того, как виртуальная машина Java израсходовала усилие в исправлении места в памяти. Использование набора могло также контролироваться опросом и пороговым механизмом уведомления, описанным выше для порога использования подобным способом.
ManagementFactory.getPlatformMXBeans(Class)
, Спецификация JMX., Способы Получить доступ к MXBeansМодификатор и Тип | Метод и Описание |
---|---|
MemoryUsage |
getCollectionUsage()
Возвращает использование памяти после виртуальной машины Java последний раз израсходованное усилие в рециркуляции неиспользованных объектов в этом пуле памяти.
|
long |
getCollectionUsageThreshold()
Возвращает пороговое значение использования набора этого пула памяти в байтах.
|
long |
getCollectionUsageThresholdCount()
Возвращает число раз, что виртуальная машина Java обнаружила, что использование памяти достигло или превысило порог использования набора.
|
Строка[] |
getMemoryManagerNames()
Возвращает имя распределителей памяти, которое управляет этим пулом памяти.
|
Строка |
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, если этот пул памяти поддерживает порог использования.
|
getObjectName
String getName()
MemoryType getType()
Доступ MBeanServer:
Отображенным типом MemoryType является String, и значение является именем MemoryType.
MemoryUsage getUsage()
Этот метод запрашивает виртуальную машину Java сделать оценку максимальных усилий из текущего использования памяти этого пула памяти. Для некоторых пулов памяти этот метод может быть дорогой работой, которая требует, чтобы некоторое вычисление определило оценку. Реализация должна задокументировать когда дело обстоит так.
Этот метод разрабатывается для использования в использовании памяти системы контроля и обнаруживающий низкое условие памяти.
Доступ MBeanServer:
Отображенным типом MemoryUsage является CompositeData с атрибутами как определено в MemoryUsage
.
MemoryUsage
объект; или null, если этот пул, не допустимый.MemoryUsage getPeakUsage()
Доступ MBeanServer:
Отображенным типом MemoryUsage является CompositeData с атрибутами как определено в MemoryUsage
.
MemoryUsage
объект, представляющий пиковое использование памяти; или null, если этот пул не допустим.void resetPeakUsage()
SecurityException
- если менеджер безопасности существует, и вызывающая сторона не имеет контроля ManagementPermission.boolean isValid()
String[] getMemoryManagerNames()
long getUsageThreshold()
setUsageThreshold
метод.UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования.isUsageThresholdSupported()
void setUsageThreshold(long threshold)
threshold
- новое пороговое значение в байтах. Должно быть неотрицательным.IllegalArgumentException
- если threshold отрицателен или больше чем максимальный объем памяти для этого пула памяти если определено.UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования.SecurityException
- если менеджер безопасности существует, и вызывающая сторона не имеет контроля ManagementPermission.isUsageThresholdSupported()
, Порог использованияboolean isUsageThresholdExceeded()
UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования.long getUsageThresholdCount()
UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования.boolean isUsageThresholdSupported()
long getCollectionUsageThreshold()
setCollectionUsageThreshold
метод.UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования набора.isCollectionUsageThresholdSupported()
void setCollectionUsageThreshold(long threshold)
Пороговая проверка пересечения использования набора включается в этом пуле памяти, если порог устанавливается к положительному значению. Пороговая проверка пересечения использования набора отключается, если она обнуляется.
threshold
- новое пороговое значение использования набора в байтах. Должно быть неотрицательным.IllegalArgumentException
- если threshold отрицателен или больше чем максимальный объем памяти для этого пула памяти если определено.UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования набора.SecurityException
- если менеджер безопасности существует, и вызывающая сторона не имеет контроля ManagementPermission.isCollectionUsageThresholdSupported()
, Порог использования набораboolean isCollectionUsageThresholdExceeded()
UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования.long getCollectionUsageThresholdCount()
UnsupportedOperationException
- если этот пул памяти не поддерживает порог использования набора.isCollectionUsageThresholdSupported()
MemoryUsage getCollectionUsage()
Доступ MBeanServer:
Отображенным типом MemoryUsage является CompositeData с атрибутами как определено в MemoryUsage
.
MemoryUsage
представление использования памяти этого пула памяти после виртуальной машины Java последний раз израсходованное усилие в рециркуляции неиспользованных объектов; null, если этот метод не поддерживается.boolean isCollectionUsageThresholdSupported()
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.