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

    页面内容

    主页面

    以我本地启动为例:
    image.png
    右侧选择需要监控的程序,按钮含义为:
    local 本地程序(本地启动的java程序)
    remote 远程应用程序(远程服务器启动的java程序,通过JMX技术实现)

    程序概述页面

    概述页面主要显示程序的启动参数和系统信息如下:
    image.png
    主要

    • PID — 程序启动后的进程号,在命令行中可以用 jps命令查看
    • 主机 — 如果是本机的话显示,localhost,如果是远程主机应该是显示远程主机的主机名或者IP
    • 主类 — 程序入口类(main方法所在的类)
    • 参数 — VisualVm 启动的时候使用的一些配置文件路径
    • JVM — jvm类型
    • Java — jdk的版本信息
    • Java Home — JDK安装目录
    • JVM参数 — VisualVm 启动时候设置的JVM参数
    • 系统属性 — java环境的系统参数

      监控页面

      监视页面主要展示系统资源占用情况如下:
      image.png
  • CPU — 展示java程序运行的时候占用的cpu资源 如下图中橙色的表示程序运行使用的cpu资源百分比,蓝色部分表示垃圾回收占用CPU资源百分比

  • 堆 — 这里要说明下堆内存的组成部分,堆是由老年代和新生代组成,其中新生代有由”伊甸园”和”两个幸存区组成”三部分组成,堆视图看到的资源占用实际是”老年代”、”伊甸园(Eden)”、”两个幸存者(Survivor )”的一个综合情况。
  • PermGen — Perm 区用来存放java类以及其他虚拟机自己的静态数据,(常被称为持久代或者方法区)
  • 类 — 此视图 主要展示 当前程序加载了多少个类
  • 线程 — 当前程序的线程启动情况
  • 执行垃圾回收 — 手动触发一次GC 相当于在程序代码中调用(System.gc()),如果是远程连接到生产环境中请慎重点击。
  • 堆Dump — 生产当前程序的内存快照hprof文件,对于分析内存溢出问题比较有帮助。(可以查看当前程序内存中的所有对象)

    线程页面

    主要展示程序中所有的线程运行状态
    image.png

  • 线程dump – 此按钮主要生产当前程序中所有线程的快照(对分析线程死锁,比较有帮助)

  • 时间线 – 展示每个线程的实时运行状态(不同颜色代表不同的状态)
  • 表 – 按照二维表格的形式展示每个线程不同状态的时间统计信息
  • 详细信息 – 用饼图展示每个线程的运行状态

    抽样器页面

    CPU-> CPU样例 – 主要展示方法消耗的CPU资源比例和时间
    image.png
    CPU->线程CPU时间 – 主要展示线程消耗的CPU资源信息
    image.png
    内存-> 堆柱状图 – 展示堆内存中各种对象占用的字节数和总实例数
    image.png
    内存-> 每个线程分配—展示不同线程占用内存的情况
    image.png

    监控远程的JVM

    VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现。
    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
    如果想要监控远程的程序,需要在启动的时候配置参数:
    1. -Dcom.sun.management.jmxremote.port=xxx //JMX远程连接接口
    2. -Dcom.sun.management.jmxremote.ssl=false // 不启用ssl
    3. -Dcom.sun.management.jmxremote.authenticate=false // 不启用身份认证
    4. -Djava.rmi.server.hostname=xxx // JMX远程主机地址
    如果远程主机为系统为LINUX,最好修改一下系统的HOSTNAME为用于连接的主机IP。
    使用VisualJVM连接远程JVM
    右键Remote->Add Remote Host
    image.png
    在一个主机下可能会有很多的JVM需要监控,所以接下来要在该主机上添加需要监控的JVM
    右键主机地址->Add JMX Connection,端口为Dcom.sun.management.jmxremote.port配置的端口
    image.png
    连接成功
    image.png