1.为什么需要jvm监控以及性能分析
开发大型 Java 应用程序的过程中难免遇到内存泄露(内存空间被无用的不死对象占有)、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。
总的来说,在一个大型java项目开发的生命周期中,jvm的性能分析以及监控是必不可少的一部分。在开发以及测试环境下,我们可以使用可视化工具对以上需求进行高效的支持。
2.VisualVM简介
VisualVM是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。
JMX是什么
JMX 全称为 Java Management Extensions,翻译过来就是 Java 管理扩展,用来管理和监测 Java 程序。最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。最主要的还是被用来做各种监控工具,比如文章开头提到的 Spring Boot Actuator、JConsole、VisualVM 等。
JMX 既是 Java 管理系统的一个标准,一个规范,也是一个接口,一个框架。有标准、有规范是为了让开发者可以定制开发自己的扩展功能,而且作为一个框架来讲,JDK 已经帮我们实现了常用的功能,尤其是对 JVM 的监控和管理。
Attach API
Attach API 不是 Java 的标准 API,而是 Sun 公司提供的一套扩展 API,用来向目标 JVM ”附着”(Attach)代理工具程序的。有了它,开发者可以方便的监控一个 JVM,运行一个外加的代理程序。
Attach API 很简单,只有 2 个主要的类,都在 com.sun.tools.attach 包里面: VirtualMachine 代表一个 Java 虚拟机,也就是程序需要监控的目标虚拟机,提供了 JVM 枚举,Attach 动作和 Detach 动作(Attach 动作的相反行为,从 JVM 上面解除一个代理)等等 ; VirtualMachineDescriptor 则是一个描述虚拟机的容器类,配合 VirtualMachine 类完成各种功能。
3.VisualVM在哪里
自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 %JAVA-HOME%/ bin 文件夹下。VisualVM 自身要在 JDK6 以上的版本上运行,但是它能够监控 JDK1.4 以上版本的应用程序
4.本地基础功能讲解
如下图,当我们本地运行java服务以后,左侧菜单栏就会出现对应的程序选项,
概述
如图,我们可以通过概述页卡看到当前java进行的PID号、JVM参数、JVM版本、主机等相关信息。同时可以获取当前java进程堆转储(dump)、线程转储(dump)、快照的相关数据。同时可以查看JVM参数,系统属性等相关信息。相当于当前java进程信息的一个总览
监视
如图,在监视页面我们可以查看CPU使用率、堆内存使用率、当前进程创建的类信息、线程以及守护线程数信息等。通过可视化页面可以直观的看到jvm中以上信息的变化。
同时右上角可以选择触发垃圾回收以及堆转储(dump)
点击堆转储(dump)后会在左侧菜单栏生成dump文件,点击后出现转储文件选项卡
可以通过转储文件选项卡查看堆中哪些对象较多以及具体实例数等信息,通常用于查看内存泄漏以及内存溢出的问题
同时可以通过在对应java进程上右键指定OOM时进行堆内容转储(dump)
线程
如图,线程选项卡可以查看当前JVM总运行线程数以及守护线程数,同时可以查看线程运行,阻塞,等待,休眠的具体时长以及总时长。
右上角提供了线程转储(dump)的功能,点击后会生成当前状态下线程转储文件选项卡,一般通过线程转储文件分析线程死锁等问题
如下图:
抽样器/Profilter
如图,可以通过CPU采样/内存采样两种方式进行数据采样分析,同时支持dump操作。可以来分析采样时间段内JVM线程运行情况以及内存占用等情况。记得采样完毕后点击停止按钮,不然采样会一直进,理论上来说会影响应用程序
同时可以点击快照按钮进行当前信息的快照持久化,方便离线状态下进行分析查看
5.远程基础功能讲解
如图:visualVM同样支持连接远程java进程分析并监控jvm
1.jar包启动加入如下参数
-Djava.rmi.server.hostname=8.142.132.135 #远程服务器IP
-Dcom.sun.management.jmxremote.port=18888 #远程服务器JMX端口
-Dcom.sun.management.jmxremote.rmi.port=19999 #远程服务器RMI端口,这个很重要!!!
-Dcom.sun.management.jmxremote #开启远程服务器链接
-Dcom.sun.management.jmxremote.ssl=false #ssl链接关闭
-Dcom.sun.management.jmxremote.authenticate=false #关闭权限校验
启动命令示例:
java -jar -Djava.rmi.server.hostname=8.142.132.135 -Dcom.sun.management.jmxremote.port=18888 -Dcom.sun.management.jmxremote.rmi.port=19999 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-provider-0.0.1-SNAPSHOT.jar
2.开通第一步中jmx以及rmi的端口
3.添加远程主机
右键点击添加远程主机->输入远程服务器IP即可
在创建好的远程链接上右键->添加JMX链接
输入远程服务器JMX端口,如需链接凭证则添加链接凭证,ssl链接等根据具体情况进行勾选
点击确认后链接成功
4.后续操作与本地基本一致
可能会出现内存快照等不可用情况,那就需要到具体服务器上用命令去执行了
6.转储(dump)/ 快照文件查看
有时候我们需要分析远程服务器的快照、转储(dump)文件。这个时候可以通过ftp或其他形式将远程服务器的相关文件拉取到本地,然后通过visualVM进行分析,具体步骤如下:
文件->装入
如图可选择四种形式的文件进行导入,根据具体情况进行导入即可
导入后即可进行转储(dump)文件的分析
7.插件安装
VisualVM同样提供了很多插件提供功能的扩展,安装步骤如下
工具->插件
在可用插件页卡勾选后进行安装即可,同时在已安装页卡可以进行卸载
推荐插件: Visual GC
通过简洁明了的图形式对虚拟机堆内存进行展示,包括新生代(Enden,s1,s0),老年代,元空间,垃圾回收次数,类加载次数,不同堆空间垃圾回收的次数以及每次消耗的时间,不同堆空间使用率等等
如下图:页面十分的简洁明了且友好