点赞 再看,能源有限。Hello world : ) 微信搜「程序猿阿朗」。
本文 Github.com/niumoo/JavaNotes 和 程序猿阿朗博客 曾经收录,有很多知识点和系列文章。
以后文章属于 Java 性能剖析优化系列文章,点击能够查看所有文章。
这篇文章是 Java 性能剖析监控与优化 系列的第一篇文章,本来是打算零碎的介绍 Java 性能剖析形式和风行的监控工具,然而提笔之后意识到,只介绍剖析形式和监控工具过于浅尝辄止了。如果只会应用某个工具而不晓得背地的实现原理,总感觉有种陌生感,我想你们也是一样,所以多了这篇文章。
Java SE 监控治理性能
这篇文章介绍 Java Standard Edition(Java SE)平台提供的监控和治理技术 – JMX(Java Management Extensions)技术。
Java SE 平台自身就提供了用于监控和治理服务的实用性功能模块,按性能来说次要分为上面四类:
- Java 监控和治理 API
- Java 虚拟机检测
- Java 治理扩大技术(JMX)
- Java 监控和治理的工具
这篇文章会介绍这四个局部的相干常识,旨在理解 Java SE 监控与治理的相干性能,对其中的相干概念有个了解。
Java 监控和治理 API
Java SE 中蕴含了用于监控和治理的(java.lang.management
)API,通过这些 API 能够实现应用程序的自我监控,此 API 次要提供了以下信息的拜访:
- 类加载相干。
- JVM 相干,如运行工夫、零碎环境变量、用户输出参数。
- 线程相干,如线程状态,线程的统计信息、线程的堆栈等。
- 内存应用状况。
- GC 状况。
- 死锁检测。
- 操作系统信息。
下图是 Java 17 中的 java.management
模块。
JConsole 就是通过拜访这些治理 API 提供的数据,绘制了监控的界面版。
Java 虚拟机监测
下面说到 Java SE 中曾经内置了开箱即用的监控和治理性能,通过这些性能能够实现程序的自我监测,Java 默认曾经实现了对 Java 虚拟机相干信息的监测,在 Java 监控和治理 API 局部也列举了 API 能够监测的局部内容,那么怎么应用呢?
上面通过一个简略的示例,演示如何通过监控治理 API 获取零碎信息、编译器信息、内存信息以及垃圾收集器信息。
package com.wdbyte;
import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryManagerMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.util.List;
import java.util.stream.Collectors;
public class JavaManagement {public static void main(String[] args) {OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
String osName = operatingSystemMXBean.getName();
String osVersion = operatingSystemMXBean.getVersion();
int processors = operatingSystemMXBean.getAvailableProcessors();
System.out.println(String.format("操作系统:%s,版本:%s,处理器:%d 个", osName, osVersion, processors));
CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();
String compilationMXBeanName = compilationMXBean.getName();
System.out.println("编译系统:" + compilationMXBeanName);
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
long max = heapMemoryUsage.getMax();
long used = heapMemoryUsage.getUsed();
System.out.println(String.format("应用内存:%dMB/%dMB", used / 1024 / 1024, max / 1024 / 1024));
List<GarbageCollectorMXBean> gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
String gcNames = gcMXBeans.stream()
.map(MemoryManagerMXBean::getName)
.collect(Collectors.joining(","));
System.out.println("垃圾收集器:" + gcNames);
}
}
运行时指定了内存为 100MB(-Xms100M -Xmx100M
),失去如下后果。
操作系统:Mac OS X,版本:11.6,处理器:12 个
编译系统:HotSpot 64-Bit Tiered Compilers
应用内存:2MB/100MB
垃圾收集:G1 Young Generation,G1 Old Generation
:::tip 留神
细看代码能够发现其中很多类都是以 MXBean 结尾,这是什么意思呢?
:::
Java 治理扩大技术(JMX)
在 Java 虚拟机监测中的代码示例中,能够看到很多命名以 MXBean 结尾的类,这里曾经波及到了 JMX(Java Management Extensions)技术。
JMX 技术提供了一种简略、规范的形式来治理资源,如操作系统、虚拟机信息、内存状态、线程信息等,这些统称为被治理的资源。而且 JMX 是能够动静的,所以能够应用 JMX 技术来监测和治理各种资源。能够应用 JMX 技术来监测 Java 虚拟机状态,也能够应用 JMX 技术构建本人的须要治理的资源。
JMX 技术只有资源定义那么简略吗?不是的。JMX 标准了 Java 中资源定义的形式、资源管理的形式、监控和治理的体系结构、具体实现的设计模式、监控和治理的相干 API 以及 用于网络的近程监控服务(RMI),这一系列性能统称为 JMX 技术。是 Java SE 平台的规范局部。
下面屡次提到了 治理资源,那么如何定义一个资源呢?JMX 技术给出了资源定义的体系结构和设计模式,在 JMX 中,通过定义一个被称为 MBean 或 MXBean 的 Java 对象来示意要治理指定的资源,资源定义的 Java 类名必须以 MBean 或 MXBean 结尾。
下图是 Java 17 中的以 MXBean 结尾的资源定义类,通过命名能够看出每个类代表了什么资源。
这篇文章次要是介绍 Java SE 中的监控与治理性能,让大家对 Java 中的监控与治理背地的原理和概念有一个具体的意识,所以 MBean 和 MXBean 的具体设计实现形式不是这篇文章的重点,这里不过多介绍,会放到下一篇独立的 JMX 技术文章中介绍。
Java 监控和治理的工具
JMX 技术中提到 JMX 不仅提供了监控和治理的 API,还提供了用于网络远程管理的服务,能够应用 JMX 相干监控管理工具,通过网络近程连贯到正在运行 Java 虚拟机,监控其运行状态,Java 中集成的 jconsole
就是这样一款工具。
本地随便启动一个能够继续运行的 Java 程序用作被监测对象,如果你曾经配置好 Java 环境变量,能够间接通过 jconsole
启动工具。
$ jconsole
启动后的 jconsole
曾经列出了本地正在运行的 Java 程序,抉择本人想要监测的进行进行监测。
连贯胜利后能够看到以后 Java 过程的资源占用状况。
在 MBean 页面中,能够看到各种曾经被定义的资源的具体情况。
Jconsole 是一款弱小的图形界面 JMX 管理工具,不仅能够连贯本地 Java 程序,还能够通过网络监控近程的 Java 程序运行状态,不过不是此篇文章重点,不在详细描述。
参考:
- https://docs.oracle.com/en/java/javase/17/jmx/
- https://docs.oracle.com/en/java/javase/17/management/
以后文章属于 Java 性能剖析优化系列文章,点击能够查看所有文章。
文章继续更新,能够微信搜一搜「程序猿阿朗 」或拜访「 程序猿阿朗博客」第一工夫浏览。本文 Github.com/niumoo/JavaNotes 曾经收录,有很多知识点和系列文章,欢送 Star。