VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中,您可以方便、快捷地查看多个 Java 应用程序的相关信息。
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
VisualVM使用简单,几乎0配置,功能还是比较丰富的,几乎囊括了其它JDK自带命令的所有功能。
- 内存信息
- 线程信息
- Dump堆(本地进程)
- Dump线程(本地进程)
- 打开堆Dump。堆Dump可以用jmap来生成。打开线程Dump
- 生成应用快照(包含内存信息、线程信息等等)
- 性能分析。CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)
-
安装
自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin 文件夹下,无需安装,直接运行jvisualvm.exe即可。
也可从官网单独下载使用,官网地址:http://visualvm.github.io/,下载后解压运行/bin目录下visualvm.exe页面内容
主页面
以我本地启动为例:
右侧选择需要监控的程序,按钮含义为:
local 本地程序(本地启动的java程序)
remote 远程应用程序(远程服务器启动的java程序,通过JMX技术实现)程序概述页面
概述页面主要显示程序的启动参数和系统信息如下:
主要 CPU — 展示java程序运行的时候占用的cpu资源 如下图中橙色的表示程序运行使用的cpu资源百分比,蓝色部分表示垃圾回收占用CPU资源百分比
- 堆 — 这里要说明下堆内存的组成部分,堆是由老年代和新生代组成,其中新生代有由”伊甸园”和”两个幸存区组成”三部分组成,堆视图看到的资源占用实际是”老年代”、”伊甸园(Eden)”、”两个幸存者(Survivor )”的一个综合情况。
- PermGen — Perm 区用来存放java类以及其他虚拟机自己的静态数据,(常被称为持久代或者方法区)
- 类 — 此视图 主要展示 当前程序加载了多少个类
- 线程 — 当前程序的线程启动情况
- 执行垃圾回收 — 手动触发一次GC 相当于在程序代码中调用(System.gc()),如果是远程连接到生产环境中请慎重点击。
堆Dump — 生产当前程序的内存快照hprof文件,对于分析内存溢出问题比较有帮助。(可以查看当前程序内存中的所有对象)
线程页面
主要展示程序中所有的线程运行状态
线程dump – 此按钮主要生产当前程序中所有线程的快照(对分析线程死锁,比较有帮助)
- 时间线 – 展示每个线程的实时运行状态(不同颜色代表不同的状态)
- 表 – 按照二维表格的形式展示每个线程不同状态的时间统计信息
- 详细信息 – 用饼图展示每个线程的运行状态
抽样器页面
CPU-> CPU样例 – 主要展示方法消耗的CPU资源比例和时间
CPU->线程CPU时间 – 主要展示线程消耗的CPU资源信息
内存-> 堆柱状图 – 展示堆内存中各种对象占用的字节数和总实例数
内存-> 每个线程分配—展示不同线程占用内存的情况
监控远程的JVM
VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现。
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
如果想要监控远程的程序,需要在启动的时候配置参数:
如果远程主机为系统为LINUX,最好修改一下系统的HOSTNAME为用于连接的主机IP。-Dcom.sun.management.jmxremote.port=xxx //JMX远程连接接口
-Dcom.sun.management.jmxremote.ssl=false // 不启用ssl
-Dcom.sun.management.jmxremote.authenticate=false // 不启用身份认证
-Djava.rmi.server.hostname=xxx // JMX远程主机地址
使用VisualJVM连接远程JVM
右键Remote->Add Remote Host
在一个主机下可能会有很多的JVM需要监控,所以接下来要在该主机上添加需要监控的JVM
右键主机地址->Add JMX Connection,端口为Dcom.sun.management.jmxremote.port配置的端口
连接成功