Используя Платформу Сервер MBean и Платформа MXBeans
Эта глава представляет сервер MBean и MXBeans, которые обеспечиваются как часть Платформы Java, Standard Edition (Java платформа SE), который может использоваться в целях управления и контроле. Расширения управления Java (JMX) технология MBeans и серверы MBean были представлены кратко в Главе 1, Кратком обзоре Java Контроль SE и управление. Больше информации о технологии JMX может быть сочтено в
Используя Платформу Сервер MBean
Сервер MBean является репозитарием MBeans, который обеспечивает доступ приложений управления к MBeans. Приложения не получают доступ к MBeans непосредственно, но вместо этого получают доступ к ним через сервер MBean через их уникальный ObjectName. Сервер MBean реализует интерфейс javax.management.MBeanServer.
Платформа сервер MBean был представлен в Java 2 Платформы, Standard Edition 5.0, и является сервером MBean, который встраивается в виртуальную машину Java (Java VM). Сервер MBean платформы может быть совместно использован всеми управляемыми компонентами, которые выполняют в Java VM. Вы получаете доступ к платформе сервер MBean, используя метод java.lang.management.ManagementFactory getPlatformMBeanServer. Конечно, можно также создать свой собственный сервер MBean, используя javax.management.MBeanServerFactory class. Однако, нет обычно никакой потребности больше чем в одном сервере MBean, таким образом используя платформу, которую рекомендуется сервер MBean.
Доступ к Платформе MXBeans
Платформа MXBean, MBean для контроля и управления Java VM. Каждый MXBean инкапсулирует часть функциональности VM. Полный список MXBeans, которым предоставляют платформу, обеспечивается в Таблице 1-1 в Главе 1, Кратком обзоре Java Контроль SE и управление.
Приложение управления может получить доступ к платформе MXBeans тремя различными способами.
-
Прямой доступ, через ManagementFactory class.
-
Прямой доступ, через прокси MXBean.
-
Косвенный доступ, через MBeanServerConnection class.
Эти три способа получить доступ к платформе MXBeans описываются в следующих трех разделах.
Доступ к Платформе MXBeans через Класс ManagementFactory
Приложение может сделать прямые звонки в методы платформы MXBean, который выполняет в том же самом Java VM как непосредственно. Чтобы выполнить прямые вызовы, можно использовать статические методы ManagementFactory class. у ManagementFactory есть методы средства доступа для каждой различной платформы MXBeans, такой как, getClassLoadingMXBean(), getGarbageCollectorMXBeans(), getRuntimeMXBean(), и так далее. В случаях, где есть больше чем одна платформа MXBean, метод возвращает список платформы найденный MXBeans.
Например, Пример 4-1 использование статический метод ManagementFactory, чтобы получить платформу MXBean RuntimeMXBean, и затем получает имя поставщика от платформы MXBean.
Пример 4-1 Доступ к Платформе MXBean через Класс ManagementFactoryRuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean(); String vendor = mxbean.getVmVendor();
Доступ к Платформе MXBeans через Прокси MXBean
Приложение может также вызвать методы MXBean платформы через прокси MXBean. Чтобы сделать так, следует создать экземпляр прокси MXBean что вперед вызовы метода данного сервера MBean, вызывая статический метод ManagementFactory.newPlatformMXBeanProxy(). Приложение обычно создает прокси, чтобы получить удаленный доступ к платформе MXBean другого Java VM.
Например, Пример 4-2 выполняет точно ту же самую работу как Пример 4-1, но на сей раз использует прокси MXBean.
Пример 4-2 Доступа к Платформе MXBean через Прокси MXBeanMBeanServerConnection mbs; ... // Get a MBean proxy for RuntimeMXBean interface RuntimeMXBean proxy = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class); // Get standard attribute "VmVendor" String vendor = proxy.getVmVendor();
Доступ к Платформе MXBeans через Класс MBeanServerConnection
Приложение может косвенно вызвать методы MXBean платформы через MBeanServerConnection, который соединяет с платформой сервер MBean другого рабочего Java VM. Вы используете метод getAttribute() class MBeanServerConnection, чтобы получить атрибут платформы MXBean, обеспечивая ObjectName MBEAN и название атрибута как параметры.
Например, Пример 4-3 выполняет то же самое задание как Пример 4-1 и Пример 4-2, но использует косвенный вызов через MBeanServerConnection.
Пример 4-3 Доступа к Платформе MXBean через Класс MBeanServerConnectionMBeanServerConnection mbs; ... try { ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME); // Get standard attribute "VmVendor" String vendor = (String) mbs.getAttribute(oname, "VmVendor"); } catch (....) { // Catch the exceptions thrown by ObjectName constructor // and MBeanServer.getAttribute method ... }
Используя Расширение Платформы Sun Microsystems
Java VMs может расширить интерфейс управления, определяя интерфейсы для специфичных для платформы измерений и операций управления. Статические методы фабрики в ManagementFactory class возвратят MBeans с расширением платформы.
Пакет com.sun.management содержит расширения платформы Sun Microsystems. Следующие разделы обеспечивают примеры того, как получить доступ к специфичному для платформы атрибуту от реализации Sun Microsystems OperatingSystemMXBean.
Доступ к Атрибутам MXBean Непосредственно
Пример 4-4 иллюстрирует прямой доступ к одному из интерфейсов MXBean Sun Microsystems.
Пример 4-4 Доступа к Атрибуту MXBean Непосредственноcom.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); // Get the number of processors int numProcessors = mxbean.getAvailableProcessors(); // Get the Sun-specific attribute Process CPU time long cpuTime = mxbean.getProcessCpuTime();
Доступ к Атрибутам MXBean через MBeanServerConnection
Пример 4-5 иллюстрирует доступ к одному из интерфейсов MXBean Sun Microsystems через MBeanServerConnection class.
Пример 4-5 Доступов к Атрибуту MXBean через MBeanServerConnectionMBeanServerConnection mbs; // Connect to a running Java VM (or itself) and get MBeanServerConnection // that has the MXBeans registered in it ... try { // Assuming the OperatingSystem MXBean has been registered in mbs ObjectName oname = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME); // Get standard attribute "Name" String vendor = (String) mbs.getAttribute(oname, "Name"); // Check if this MXBean contains Sun Microsystems' extension if (mbs.isInstanceOf(oname, "com.sun.management.OperatingSystemMXBean")) { // Get platform-specific attribute "ProcessCpuTime" long cpuTime = (Long) mbs.getAttribute(oname, "ProcessCpuTime"); } } catch (....) { // Catch the exceptions thrown by ObjectName constructor // and MBeanServer methods ... }
Контроль Конкуренции Потока и Процессорное время
Платформа ThreadMXBean MXBean оказывает поддержку для того, чтобы контролировать конкуренцию потока и Центральный процессор потока (ЦП) время.
Sun HotSpot VM поддерживает контроль конкуренции потока. Вы используете метод ThreadMXBean.isThreadContentionMonitoringSupported(), чтобы определить, поддерживает ли Java VM контроль конкуренции потока. Состязательный контроль потока отключается по умолчанию. Используйте метод setThreadContentionMonitoringEnabled(), чтобы включить этому.
Sun HotSpot VM поддерживает измерение процессорного времени потока на большинстве платформ. У процессорного времени, обеспеченного этим интерфейсом, есть точность наносекунды, но не обязательно точность наносекунды.
Вы используете метод isThreadCpuTimeSupported(), чтобы определить, поддерживает ли Java VM измерение процессорного времени для какого-либо потока. Вы используете isCurrentThreadCpuTimeSupported(), чтобы определить, поддерживает ли Java VM измерение процессорного времени для текущего потока. Java VM, который поддерживает измерение процессорного времени для любого потока, будет также поддерживать это для текущего потока.
Java VM может отключить измерение процессорного времени потока. Вы используете метод isThreadCpuTimeEnabled(), чтобы определить, включается ли измерение процессорного времени потока. Вы используете метод setThreadCpuTimeEnabled(), чтобы включить или отключить измерение процессорного времени потока.
Управление Операционной системой
Платформа OperatingSystem MXBean позволяет Вам получать доступ к определенной информации о ресурсе операционной системы, такой как следующий.
-
Обработайте процессорное время.
-
Количество полной и свободной физической памяти.
-
Количество фиксировавшей виртуальной памяти (то есть, количество виртуальной памяти, которая, как гарантируют, будет доступна рабочему процессу).
-
Количество полной и свободной области подкачки.
-
Число открытых дескрипторов файлов (только для платформ UNIX).
Когда Операционная система, MXBean на вкладке MBeans выбирается в JConsole, Вы видите все атрибуты и операции включая расширение платформы. Можно наблюдать изменения числового атрибута в течение долгого времени двойным щелчком поле значения атрибута.
Журналирование управления
Java платформа SE обеспечивает специальный MXBean для того, чтобы он зарегистрировал цели, интерфейс LoggingMXBean.
LoggingMXBean позволяет Вам выполнить следующие задачи.
-
Получите имя уровня журнала, связанного с указанным регистратором.
-
Получите список в настоящий момент зарегистрированных регистраторов.
-
Получите имя родителя для указанного регистратора.
-
Установите указанный регистратор в указанный новый уровень.
Уникальным ObjectName LoggingMXBean является java.util.logging:type=Logging. Это имя объекта сохранено в LogManager.LOGGING_MXBEAN_NAME.
Есть единственный глобальный экземпляр LoggingMXBean, который можно получить, вызывая LogManager.getLoggingMXBean().
Logging MXBean определяет атрибут LoggerNames, описывающий список имен регистратора. Чтобы найти список регистраторов в Вашем приложении, можно выбрать Журналирование MXBean под доменом java.util.logging на вкладке MBeans, и двойной щелчок по полю значения атрибута LoggerNames. Журналирование MXBean также поддерживает две операции.
-
getLoggerLevel: Возвращает уровень журнала данного регистратора.
-
setLoggerLevel: Устанавливает уровень журнала данного регистратора к новому уровню.
Эти операции берут имя регистратора в качестве первого параметра. Чтобы изменить уровень регистратора, введите имя регистратора в первом параметре и имени уровня, в который это должно быть установлено во втором параметре работы setLoggerLevel.
Обнаружение Низкой Памяти
Использование памяти является важным атрибутом системы памяти. Это может быть показательно из следующих проблем.
-
Чрезмерное потребление памяти приложением.
-
Чрезмерная рабочая нагрузка налагается на автоматическую систему управления памятью.
-
Потенциальные утечки памяти.
Есть два вида порогов памяти, которые можно использовать, чтобы обнаружить низкие условия памяти: порог использования и порог использования набора. Можно обнаружить низкие условия памяти, используя или этих порогов с опросом или порогового уведомления. Все эти понятия описываются в следующих разделах.
Пороги памяти
У пула памяти может быть два вида порогов памяти: порог использования и порог использования набора. Любой из этих порогов не может поддерживаться определенным пулом памяти. Значения для порога использования и порога использования набора могут оба быть установлены, используя вкладку MBeans в JConsole.
Порог использования
Порог использования является управляемым атрибутом некоторых пулов памяти. Это позволяет Вам контролировать использование памяти с низкими издержками. Устанавливание порога к положительному значению позволяет пулу памяти выполнить пороговую проверку использования. Устанавливание порога использования, чтобы обнулить отключает пороговую проверку использования. Значение по умолчанию предоставляется Java VM.
Java VM выполняет порог использования, проверяющий пул памяти в наиболее подходящее время, обычно во время сборки "мусора". Каждый пул памяти постепенно увеличивает пороговое количество использования всякий раз, когда использование пересекает порог.
Вы используете метод isUsageThresholdSupported(), чтобы определить, поддерживает ли пул памяти порог использования, так как порог использования не является подходящим для некоторых пулов памяти. Например, в generational сборщике "мусора" (таком как тот в HotSpot VM; см. Сборку "мусора" в Главе 3, Используя JConsole), большинство объектов выделяется в молодой генерации от пула памяти Рая. Пул Рая разрабатывается, чтобы быть заполненным. Собирая "мусор" пул памяти Рая освободит большую часть своего пространства памяти, так как это, как ожидают, будет содержать главным образом недолгие объекты, которые недостижимы во время сборки "мусора". Так, для пула памяти Рая не уместно поддерживать порог использования.
Порог Использования набора
Порог использования набора является управляемым атрибутом некоторых, собрал "мусор" пулы памяти. После Java VM выполнил сборку "мусора" на пуле памяти, некоторая память в пуле будет все еще использоваться. Порог использования набора позволяет Вам устанавливать значение для этой памяти. Вы используете метод isCollectionUsageThresholdSupported() MemoryPoolMXBean, чтобы определить, поддерживает ли пул порог использования набора.
VM Java может проверить порог использования набора на пуле памяти, когда это выполняет сборку "мусора". Установите порог использования набора к положительному значению, чтобы позволить проверить. Установите порог использования набора, чтобы обнулить (значение по умолчанию), чтобы отключить проверку.
Порог использования и порог использования набора могут быть установлены на вкладке MBeans JConsole.
Память MXBean
Различными порогами памяти можно управлять через платформу MemoryMXBean. MemoryMXBean определяет следующие четыре атрибута.
-
HeapMemoryUsage: атрибут "только для чтения", описывающий текущее использование памяти "кучи".
-
NonHeapMemoryUsage: атрибут "только для чтения", описывающий использование памяти не"кучи".
-
ObjectPendingFinalizationCount: атрибут "только для чтения", описывающий число объектов, ожидающих для завершения.
-
Verbose: булев атрибут, описывающий Сборку "мусора" (GC) многословная установка трассировки. Это может быть установлено динамически. Многословные трассировки GC будут выведены на экран в расположении, определенном, когда Вы запустите Java VM. Расположением значения по умолчанию для GC многословный вывод Горячей точки VM является stdout.
Память MXBean поддерживает одну работу, gc, для явных запросов сборки "мусора".
Детали Памяти интерфейс MXBean определяются в спецификации java.lang.management.MemoryMXBean.
Пул памяти MXBean
Платформа MemoryPoolMXBean MXBean определяет ряд операций, чтобы управлять порогами памяти.
-
getUsageThreshold()
-
setUsageThreshold(long threshold)
-
isUsageThresholdExceeded()
-
isUsageThresholdSupported()
-
getCollectionUsageThreshold()
-
setCollectionUsageThreshold(long threshold)
-
isCollectionUsageThresholdSupported()
-
isCollectionUsageThresholdExceeded()
У каждого пула памяти может быть два вида порогов памяти для низкой поддержки обнаружения памяти: порог использования и порог использования набора. Любой из этих порогов не мог бы поддерживаться определенным пулом памяти. Для получения дополнительной информации см. справочную документацию API для MemoryPoolMXBean class.
Опрос
Приложение может непрерывно контролировать свое использование памяти, вызывая или метод getUsage() для всех пулов памяти или метод isUsageThresholdExceeded() для пулов памяти, которые поддерживают порог использования.
Примеру 4-6 выделили поток распределению задачи и обработке. В каждом интервале это определяет, должно ли это получить и обработать новые задачи, основанные на его использовании памяти. Если использование памяти превышает свой порог использования, оно перераспределяет выдающиеся задачи к другому VMs и прекращает получать новые задачи до возвратов использования памяти ниже порога.
Пример 4-6 Используя Опросpool.setUsageThreshold(myThreshold); .... boolean lowMemory = false; while (true) { if (pool.isUsageThresholdExceeded()) { lowMemory = true; redistributeTasks(); // redistribute tasks to other VMs stopReceivingTasks(); // stop receiving new tasks } else { if (lowMemory) { // resume receiving tasks lowMemory = false; resumeReceivingTasks(); } // processing outstanding task ... } // sleep for sometime try { Thread.sleep(sometime); } catch (InterruptedException e) { ... } }
Пример 4-6 не дифференцирует случай, в котором использование памяти временно опустилось ниже порога использования от случая, в котором использование памяти остается выше порога между двумя итерациями. Можно использовать пороговое количество использования, возвращенное getUsageThresholdCount(), чтобы определить, возвратилось ли использование памяти ниже порога между двумя опросами.
Чтобы протестировать порог использования набора вместо этого, Вы используете isCollectionUsageThresholdSupported(), методы isCollectionThresholdExceeded() И getCollectionUsageThreshold() таким же образом как выше.
Пороговые Уведомления
Когда MemoryMXBean обнаруживает, что пул памяти достиг или превысил свой порог использования, это испускает порог использования превышенное уведомление. MemoryMXBean не будет выпускать другой порог использования превышенное уведомление, пока использование не упало ниже порога и затем превысило его снова. Точно так же, когда использование памяти после сборки "мусора" превышает порог использования набора, MemoryMXBean испускает порог использования набора превышенное уведомление.
Пример 4-7 реализаций та же самая логика как Пример 4-6, но пороговое уведомление об использовании использования, чтобы обнаружить низкие условия памяти. После получения уведомления слушатель уведомляет другой поток, чтобы выполнить действия, такие как перераспределение выдающихся задач, отказ принять новые задачи, или разрешение новых задач быть принятым снова.
Вообще, следует разработать метод handleNotification, чтобы сделать минимальный объем работы, избежать вызывать задержку поставки последующих уведомлений. Следует выполнить отнимающие много времени действия в отдельном потоке. Так как многократные потоки могут одновременно вызвать слушателя уведомления, слушатель должен синхронизировать задачи, которые это выполняет должным образом.
Пример 4-7 Используя Пороговые Уведомления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, redistribute tasks to other VMs & 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);
Принятие этого пула памяти поддерживает порог использования, можно установить порог к некоторому значению (представляющий многие байты), выше которого приложение не будет принимать новые задачи.
pool.setUsageThreshold(myThreshold);
После этой точки включается пороговое обнаружение использования, и MyListener обработает уведомление.