Java的JMC和飞行记录器FlightRecord

JRE版本:oracle jre8

Docker版本:docker-ce 19.03.08

CentOS版本:centos8

飞行记录器属于JMC,JMC的全称是Java Mission Control,在jdk的安装目录里面就可以找到这个工具。

从oracle的官网来看,JMC和飞行记录器是官方很重视的性能分析工具,它们实际使用起来也比MAT这种东西要方便实用得多,官方对于它的描述是:Advanced Java Diagnostics and Monitoring Without Performance Overhead。关于版本等更多的信息可以查看官网:https://docs.oracle.com/javacomponents/index.html。

这里需要注意的一点是,JMC可以用于java7以上的所有版本,而飞行记录器,只能用于oracle jre,且是java7及以上的版本,因为要使用飞行记录器,需要开启jvm的商业特性,也就是在启动的时候加上参数:"-XX:+UnlockCommercialFeatures","-XX:+FlightRecorder"。如果是open jdk,尝试加这两个参数的时候,会直接导致虚拟机终止,无法正常启动。所以,飞行记录器只能局限在oracle jdk里面使用。

下面演示如何开启飞行记录器,并远程监控服务器的jvm。这里我基于docker来做。

1.使用ide创建一个简单的demo项目,随便什么项目都可以,打成jar包,放到Linux服务器的home/java目录里面。

2.创建一个oracle jre8镜像,创建方式,可以参考我的另外一篇博客:https://blog.csdn.net/dap769815768/article/details/105414717

3.在home/java目录里面,新增一个Dockerfile文件,内容如下:

FROM jre8:1.0

ADD test-1.0.jar test-1.0.jar

CMD ["java",
//开启商业特性和飞行记录器
"-XX:+UnlockCommercialFeatures",
"-XX:+FlightRecorder",
//开启远程调试
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005",
//开启JMC服务端口
"-Dcom.sun.management.jmxremote.rmi.port=1099",
"-Dcom.sun.management.jmxremote=true",
"-Dcom.sun.management.jmxremote.port=1099",
"-Dcom.sun.management.jmxremote.ssl=false",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.local.only=false",
//这个ip是你的服务器所在的ip,不是你的本地机器的ip
"-Djava.rmi.server.hostname=192.168.231.200",
"-jar",
"test-1.0.jar"]

这里我为了展示方便,给参数部分加了换行,这不符合Dockerfile文件的格式,使用的时候把注释和换行去掉,不然会报错

4.执行命令:

docker build -t test .

执行成功后,这个java程序镜像就创建起来了。

5.运行容器:

docker run --name test -p 1099:1099 -p 5005:5005 test

-p参数是将需要用到的端口从容器映射到Linux系统。

6.容器启动起来后,在本地打开jdk安装目录的JMC,一般在bin目录下:

界面如下:

Java的JMC和飞行记录器FlightRecord_第1张图片

打开 文件=》连接。建立一个新的连接:

Java的JMC和飞行记录器FlightRecord_第2张图片

测试连接成功后,点击完成,打开新建立的连接,首页如下:

Java的JMC和飞行记录器FlightRecord_第3张图片

双击飞行记录器,就可以针对某一段时间进行采样分析:

Java的JMC和飞行记录器FlightRecord_第4张图片

采样结果截图:

Java的JMC和飞行记录器FlightRecord_第5张图片

你可能感兴趣的:(Java的JMC和飞行记录器FlightRecord)