Я — воздушный змей, официальный аккаунт «Воздушный змей в древние времена», вдохновитель программистов с глубиной и широтой, а также фермер-пастор, который планировал писать стихи, но написал код! Статьи будут включены вJavaNewBeeТакже есть карта знаний Java back-end, и в ней путь от Xiaobai до Daniel.
Если раньше не трогали, то будет вопрос из трех комитов "Что это? Что? Это?"
Хотя вы можете этого не знать, вы, должно быть, более или менее сталкивались с этим.
Например, если вы используете Spring Boot, вы использовали Spring Boot Actuator, который использует JMX. Например, если вы использовали JConsole или VisualVM, они также используют JMX.
Начнем с картинки выше, с помощью JMX можно сделать такой JVM-мониторинг.
![8](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-583f72d0d302b47c29bd57188336af3d91d62ea1dbd50f4026a5bb6a4d137f9b83f0e3ec.png)
![10](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-6d4872d8366f25779f2c3080199dee4bbda060c5fad62c998d49fe74464736d717053848.png)
Разве это не интересно.
Выше показан интерфейс, который я реализовал сам, а на следующем рисунке показан интерфейс JConsole и VisualVM.
![1](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-78173dcdf63c39780cce03b96cbcaf38e4d2b22ced5d74fee298924fcd48138bfab70fa8.png)
Как они используют JMX, следующий шаг за шагом.
Что такое JMX
Полное название JMX — Java Management Extensions, что переводится как Java Management Extensions, которые используются для управления и мониторинга Java-программ. Чаще всего используется мониторинг и управление JVM, например памятью JVM, использованием ЦП, количеством потоков, сборкой мусора и так далее. Кроме того, его также можно использовать для динамического изменения уровня журнала.Например, log4j поддерживает метод JMX для динамического изменения уровня журнала онлайн-сервисов. Самое главное — использовать для этого различные инструменты мониторинга, такие как Spring Boot Actuator, JConsole, VisualVM и т. д., упомянутые в начале статьи.
JMX — это не только стандарт, спецификация, но также интерфейс и фреймворк для системы управления Java. Существуют стандарты и спецификации, позволяющие разработчикам настраивать и разрабатывать свои собственные функции расширения, а в качестве основы JDK помог нам реализовать общие функции, особенно мониторинг и управление JVM.
![2](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-dc655dc5bc13158ab469499c63ee486c0d4b62f13cbd68af408b4f6be8329088dbad0f63.png)
Рисунок выше представляет собой простую схематическую диаграмму архитектуры JMX.Простое понимание состоит в том, что система управления может управлять различными ресурсами через JMX.
система управленияЕго можно понимать как клиент управления, такой как упомянутые выше JConsole, VisualVM и Metrics, очень известный набор инструментов для мониторинга Java, или ваш собственный клиент, реализованный через интерфейс JMX.РесурсыТакие как конфигурация системы, метрики JVM и т. Д. или конкретные ресурсы в вашем собственном проекте и т. Д.
А вот и точка, JMX
![3](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-ec4dfc72634d4a34ff7fc5a9635a14e7184b2ad77b1ac93a71c2e12a780940e0452c7b3c.png)
Эта архитектурная диаграмма расширяет представленную выше архитектурную диаграмму и кратко представляет ее снизу вверх.
MBean
JMX передает сообщения через различные компоненты MBean (управляемые компоненты), которые на самом деле представляют собой то, что мы часто называем Java Beans, но их называют MBean, поскольку они особенные. Поскольку это Bean, в нем есть некоторые свойства и методы, и внешний мир может получать состояние управляемых ресурсов и манипулировать поведением MBean. В JMX существует четыре типа MBean, а именно: стандартный MBean, динамический MBean, открытый MBean и модельный MBean. Компоненты MBean, предоставляемые JDK, в основномjava.lang.management
иjavax.management
внутри сумки. Вы можете зайти и посмотреть, и вы увидите много знакомых цифр, таких как связанные с памятью и связанные с потоками. Разве это не то, что мы видели на VisualVM? Да, данные взяты отсюда.
Если честно, мне не нужно слишком заботиться о разнице между такими видами MBEANS, но я дам краткое введение.
Standard MBean 就是普通的 Java Bean 没有区别,它也是 JMX 中最简单、使用最多的一种。 в основном наjava.lang.management
внутри сумки.
Динамические MBean-компоненты на самом деле являются компромиссом.Поскольку некоторые из этих MBean-компонентов уже существуют, преобразование их в стандартные MBean-компоненты трудоемко и непрактично, поэтому существуют динамические MBean-компоненты. Интерфейс Dynamic MBean находится вjavax.management.DynamicMBean
Здесь определяются некоторые методы интерфейса, такие как динамическое получение свойств, установка свойств и т. д.
Есть два других типа MBeans: Open MBeans и Model MBeans, которые на самом деле также являются динамическими MBeans.
Единственная разница между Open MBeans и другими динамическими MBeans заключается в том, что первый имеет ограничения на параметры и возвращаемые значения своих открытых интерфейсов — только примитивные типы илиjavax.management.openmbean
ArrayType, Compositetype, Tarbulartype и другие типы в пакете. Это в основном связано с распределением системы управления, очень вероятно, что система удаленного управления и даже слой MBServer не имеет специальных классов в интерфейсе MBEAN.
MBeanServer
MBeanServer отвечает за управление MBeans.Как правило, JVM имеет только один MBeanServer.Все MBeans должны быть зарегистрированы на MBeanServer и предоставлять внешние услуги через MBeanServer. общее использованиеManagementFactory.getPlatformMBeanServer()
Метод получает MBeanServer в текущей JVM.
Адаптеры и разъемы
После регистрации написанного MBean на MBeanServer функция уже доступна. Адаптеры и разъемы — это способ открыть эти возможности.
Например, адаптер протокола HTTP должен открыть функцию для протокола HTTP, чтобы мы могли использовать ее в браузере. Однако JDK предоставляет только стандарт реализации адаптера, конкретной реализации нет.HtmlAdaptorServer
, для которого требуется поддержка пакета jmxtools.jar.
Соединитель чаще всего используется различными клиентами.Соединитель по умолчанию, предоставляемый JDK, — это соединитель RMI, который используется JConsole и VisualVM.
Внедрение и использование MBean
Хотя Java предоставляет стандарты и правила для реализации MBean, нам редко приходится разрабатывать MBean. Большинство разработчиков используют только JDK или компоненты MBean, определенные третьими сторонами. Мы знаем Tomcat и Spring Boot Actuator.
Определение интерфейсов MBean и классов сущностей
// 接口
public interface UserMBean {
String getName();
String getPassword();
String getPhone();
void say();
}
public class User implements UserMBean {
@Override
public String getName() {
return "风筝";
}
@Override
public String getPassword() {
return "密码不可见";
}
@Override
public String getPhone() {
return "18900000000";
}
@Override
public void say() {
System.out.println("Hello JMX");
}
}
Класс сущности должен наследовать класс интерфейса MBean, а правило именования класса интерфейса — «имя класса сущности + MBean», что является фиксированным правилом.
Зарегистрируйте определенный MBean на MBeanServer.
public static void main(String[] args) throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName userName = new ObjectName("FengZheng:type=customer,name=customerUserBean");
server.registerMBean(new User(), userName);
try {
//这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServer
LocateRegistry.createRegistry(8999);
//URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
JMXServiceURL url = new JMXServiceURL
("service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
System.out.println("begin rmi start");
jcs.start();
System.out.println("rmi start");
} catch (RemoteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Thread.sleep(60 * 60 * 1000);
}
ManagementFactory.getPlatformMBeanServer()
Получите MBeanServer текущей JVM. ObjectName — это уникальный идентификатор MBean. Один MBeanServer не может иметь дубликатов. Полный формат «настраиваемое пространство имен: тип = настраиваемый тип, имя = настраиваемое имя». Конечно, вы можете объявить только тип без имени.
Просмотр с помощью JConsole
JConsole - это инструмент, который поставляется с JDK. Он может быть запущен в каталоге Bin of {java_home}. После запуска найдите процесс, в котором главный метод, запущенный на предыдущем шаге, находится в локальном процессе.
![4](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-2e4c6ccb860712ef5bbee7c75bc00b5acebdedeea584fc887fa5054f9211d8b0fe8bcb84.png)
Над JConsole есть вкладки памяти, потока, класса и другие, щелкните последний MBean, на этой вкладке вы можете увидеть все определенные MBeans текущей JVM. Вы можете увидеть MBean, определенный системой, а также MBean, который мы только что определили.
![5](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-9e14da61ce5b8c62b6ee400d4f5140d93967dad360a7b992b654dcd4f2f9ca7bfc35b2bb.png)
Щелкните свойство, чтобы просмотреть значение свойства справа, а в пункте меню операции вы можете увидеть метод, который мы определили, и вызвать его.
![6](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-4cadef5835aae10351b9b4585084a35a2f5c081bb8cdd0b1eaedc5635fd85329ecc03375.png)
![7](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-8831a516b9ecd94eb2a9f3b67e0cddf10a8c8b3b7ad69a5dba42763daaaedbc7be15e39b.png)
Подключиться с помощью RMI
RMI обычно используется для подключения к удаленным службам, конечно, локальные процессы также могут. Это также первый шаг в реализации подключения к удаленному клиенту службы. Когда мы регистрировали MBean, заметили ли мы, что после завершения регистрации остается большой фрагмент кода, который используется для открытия соединения RMI, открытия порта 8999 в качестве порта доступа RMI, а затем клиент может использовать подключена фиксированная строка подключения.
Формат службы строки подключения: jmx:rmi:///jndi/rmi://host:port/jmxrmi
public class Client {
public static void main(String[] args) throws IOException, Exception, NullPointerException {
String jmxUrl = "service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi";
monitor(jmxUrl);
}
public static void monitor(String url) throws Exception{
JMXServiceURL jmxServiceURL = new JMXServiceURL
(url);
JMXConnector jmxc = JMXConnectorFactory.connect(jmxServiceURL, null);
MBeanServerConnection msc = jmxc.getMBeanServerConnection();
String[] domains = msc.getDomains();
for (String domain : domains) {
System.out.println(domain);
}
}
}
Сначала получите его на основе строки подключенияJMXServiceURL
Объект, затем пройтиJMXConnectorFactory.connect
способ получитьJMXConnector
, затем пройтиgetMBeanServerConnection
получитьMBeanServerConnection
. После этого можно получить все MBeans. вgetDomains
Это метод получения всех пространств имен, то есть «FengZheng», который мы определили выше, а также JMImplementation, java.lang и т. д., что мы и видим в JConsole.
Сделал простой мониторинг веб-версии
Изначально, чтобы узнать больше о JMX, первым делом нужно было отобразить все MBeans и атрибуты и начать выводить их в консоль, но эффект был нехороший, содержание было слишком длинным и недостаточно интуитивным, а затем я добавил древовидная структура веб-конца. Потом, делая это, я вдруг обнаружил, что с небольшой модификацией его можно использовать как простой терминал мониторинга для веб-версии.
Этот инструмент тестируется только в среде JVM 8 горячей точки. Убедитесь, что локальная JVM может поддерживать мониторинг в реальном времени и удаленную JVM.
Передний конец использует реакцию 16 + andd + пряжу, а задний конец использует весенние загрузки + Java 1.8. Специфическое использование можно просматривать на странице Readme репозитория GitHUB. и предоставляет онлайн-версию для предварительного просмотра,В конце статьи есть адреса исходников и как пользоваться онлайн-версией.
![8](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-e993cdcfa2acb8558fd660cb94fef997a7429251b432427a7834e55d75c9c5f72eecedbe.png)
Поддерживается как локальная JVM, так и удаленная JVM.
![9](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-d2a2d7fb93231e2769277b7dc87995a50ababa4f7ded76012207f647fcbde440d38b7ef4.png)
Отображение дерева всех компонентов MBean и отображение атрибутов и операций.
![10](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-3f728612d0206a92e3b0339542266da4b24c960ca500e64aaaa8a79b17f8682c6d57ed80.png)
JVM Operational Real-Time Display
Функция может быть достигнута следующими аспектами:
-
Отображение всех MBeans;
-
Отображение системной информации, включая использование памяти, использование процессора и т. д.;
-
параметры JVM, включая параметры командной строки и системные свойства;
-
Линейная диаграмма ЦП, кучи, метапространства, загрузки классов, потоков в реальном времени;
-
Тип сборщика мусора и количество сборок;
Давайте объединим эти части, чтобы поговорить об использовании JMX.
Приобретение MBeans
Подобно древовидному представлению MBean-компонентов в различных инструментах, сами MBean-компоненты существуют в этой иерархической взаимосвязи.
Компоненты MBean содержатся в домене, который эквивалентен набору независимых пространств, в которых могут быть определены различные типы и имена объектов с различными именами. Например, настроенный в предыдущей статье JMX.
MBean ObjectName может получать различную информацию, включая атрибуты, операции, уведомления.
Некоторые свойства представляют собой простые типы данных, такие как int, long, double, String, а другие — более сложные, например, свойство DiagnosticOptions в com.sun.management:type=HotSpotDiagnostic имеет тип javax.management.openmbean.CompositeData. Существуют также свойства с типом данных javax.management.openmbean.TabularData. Все это решается индивидуально.
![1](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-813f94897a4b8452c1db6d11d583578ef5a277fdae307d5742689b8df5339f3f39020fe1.png)
Часто используемые компоненты MBean
Некоторые индикаторы используются для мониторинга, например, MBeans, связанные с памятью, ЦП, пространством кучи, потоками и загрузкой классов.
JDK предоставляет ManagementFactory, чтобы помочь нам легко получить часто используемые компоненты MBean. Вы можете найти этот класс в пакете java.lang.management, чтобы увидеть комментарии и код.
OperatingSystemMXBean
Вы можете получить информацию, связанную с операционной системой, такую как имя компьютера, использование памяти и использование ЦП.
доступныйManagementFactory.getOperatingSystemMXBean()
способ получения.
RuntimeMXBean
Вы можете получить информацию о текущей JVM, включая параметры JVM и системные параметры, связанные с JVM.
в состоянии пройтиManagementFactory.getRuntimeMXBean()
способ получения.
MemoryMXBean
Вы можете получить текущее использование памяти JVM, в том числе в памяти кучи и кучу без памяти.
в состоянии пройтиManagementFactory.getMemoryMXBean()
Получать
ThreadMXBean
Получите информацию об использовании потоков JVM, включая активные потоки, потоки демона, всплески потоков и многое другое.
в состоянии пройтиManagementFactory.getThreadMXBean()
Получать.
ClassLoadingMXBean
Получите статус загрузки класса JVM, включая загруженные классы, выгруженные классы и т. д.
в состоянии пройтиManagementFactory.getClassLoadingMXBean()
Получать.
GarbageCollectorMXBean
Получите сборщик мусора JVM, включая используемый сборщик мусора, количество сборок и т. д.
в состоянии пройтиManagementFactory.getGarbageCollectorMXBeans()
Acquire, обратите внимание, что здесь приобретается коллекция, потому что сборщик мусора делится на два поколения: старое поколение и новое поколение.
В дополнение к приведенным выше нескольким часто используемым компонентам MBean существует множество других. Некоторые из них предоставляются в классе ManagementFactory, а многие другие должны быть получены с помощью ObjectName.
Исходный код здесь
Опубликовать фотографии, но не семена, ......Конечно, я не могу делать такие вещи.
Исходный код размещен на github, адресGitHub.com/Ху Чжичэн/…, README Существуют определенные методы использования. Поскольку JVM под каждой операционной системой также отличается, а Windows, Mac и Linux не универсальны, поэтому доступного пакета jar для выпуска нет. Например, Mac, который я использую для разработки, и система Linux для экспериментальной среды отличаются друг от друга и должны компилироваться отдельно. При его использовании вам необходимо загрузить исходный код, скомпилировать его локально, а затем запустить.
Заинтересованные могут попробовать это, добро пожаловать в Paizhuan.
Не жди сильного мужика, сначала поставь лайк, меня вечно трахают зря, и мое тело этого не выдерживает!
публика"древний воздушный змей”, Java-разработчик, инженер полного стека, известный как покойный маленький принц, убийца ошибок, хорошо решающий проблемы. Программист-поощритель с глубиной и широтой, пастырский фермер-кодировщик, который планировал писать стихи, но написал код! Придерживайтесь оригинального выхода галантереи, вы можете подписаться на меня сейчас или посмотреть исторические статьи, а затем обратить внимание. Нажмите и удерживайте QR-код, чтобы подписаться и стать лучше вместе со мной!