JVM调优工具详解(9大主流调优工具)

JVM调优工具详解(9大主流调优工具)-mikechen

企业级应用开发中经常会遇到以下问题,可以使用工具对JVM进行监管,以便及时查找问题,比如:

  • 内存不足OutOfMemory(大对象没有gc等),内存泄露
  • 线程死锁,线程数过多
  • 锁争用(Lock Contention),资源未及时释放(数据库)
  • Java进程CPU消耗过高

针对以上问题如何通过工具来分析与解决呢?下面一一详解。

Java自带工具

  Java安装目录的bin文件加下有一些工具可以用来监控JVM性能,如jconsole、jvisualvm、jmap、jps、jstack、jhat、jstat等。

1. jconsole

  jconsole可以监控Java应用程序(如jar应用、tomcat等),但被监视的应用程序必须和jconsole是用同一个用户运行的。jvisualvm的使用和jconsole类似。

  • 本地监控: jconsole pid
  • 远程监控: jconsole [ hostname:portNum ]

使用远程监控需要配置jmx代理信息,修改Tomcat的bin目录下的catalina.bat。

set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=HostIP
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8888
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false

  连接成功后可以在overview中查看内存、线程、类及CPU使用情况:

JVM调优工具详解(9大主流调优工具)-mikechen

2. probe

Lambda Probe 是基于 Web + AJAX 的强大的免费开源工具,可以用来实时管理一个单独的host。LambdaProbe拥有几乎所有Tomcat Manager的功能,还包括应用程序、数据源、发布、日志、线程、集群、系统信息、状态、连接器状态这些功能,并能显示 Server 的详细内存占用状态。

3. jmap

  打印java进程的堆内存信息。

  • jmap -heap pid    查看heap的概要信息,GC使用的算法、heap的配置及wise heap的使用情况.
  • jmap -histo[:live] pid 查看堆内存中的每个类的类名、实例数量、内存占用大小
  • jmap -dump:live, format=b, file=fileName pid 将内存使用情况导出到文件中,再用jhat、MAT、VisualVM分析查看,以便查找内存溢出原因

4. jhat

  jhat可以对JVM中导出的文件进行分析,使用命令 jhat fileName 即可以在浏览器中输入http://localhost:7000查看内存信息。如果Dump文件太大需要加上-J-Xmx512m指定最大堆内存,如 jhat -J-Xmx512m [-port 9998] tmp.bin

  分析内存还可以使用Eclipse的Memory Analyzer,插件地址
http://download.eclipse.org/releases/juno,找到General Purpose Tools底下的Memory Analyzer并安装。

5. jstat

  查看classloader,compiler,gc相关信息,实时监控资源和性能 。jstat工具特别强大,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

语法结构:

jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]]

Options — 通常使用 -gcutil 查看gc情况
interval – 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次

结果说明:

S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT— 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT— 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

  • jstat –class<pid> : 显示加载class的数量,及所占空间等信息。
  • jstat -compiler <pid>: 显示VM实时编译的数量等信息。
  • jstat -gc <pid>: 显示gc的信息,查看gc的次数,及时间。
  • jstat -gccapacity <pid>: 显示VM内存中三代(young,old,perm)对象的使用和占用大小
  • jstat -gcutil <pid>: 统计gc信息
  • jstat -gcnew / gcnewcapacity<pid>: 年轻代对象的信息(及其占用量)。
  • jstat -gcold / gcoldcapacity <pid> :old代对象的信息(及其占用量)。
  • jstat -gcpermcapacity <pid>: perm对象的信息及其占用量。
  • jstat -printcompilation <pid>: 当前VM执行的信息。

JVM调优工具详解(9大主流调优工具)-mikechen

6. jstack

  jstack用于生成java虚拟机当前时刻的线程快照,主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

语法: jstack [ option ] pid

-F 当 jstack [-l] pid 没有响应的时候强制打印栈信息

-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

JVM调优工具详解(9大主流调优工具)-mikechen

jstack应用一: JVM调优之jstack找出最耗cpu的线程并定位代码

jstack应用二: 三个实例演示 Java Thread Dump 日志分析

7. jps

用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

命令格式:jps [options ] [ hostid ]

[options]选项 :
-q: 输出VM标识符pid
-m:输出main method的参数
-l: 输出完全的包名,应用主类名,jar的完全路径名
-v: 输出jvm参数
-V: 输出通过flag文件传递到JVM中的参数
-Joption:传递参数到vm,例如:-J-Xms512m

[hostid]:[protocol:][[//]hostname][:port][/servername]

JVM调优工具详解(9大主流调优工具)-mikechen

jvisualvm — JVM监控

jvisualvm 是 jdk 提供的监控工具,位于
%JAVA_HOME%/bin/jvisualvm.exe,双击运行即可。

VisualVM 提供了一个可视界面,用于查看JVM上运行的基于 Java 技术的应用程序的详细信息。VisualVM 能够监控线程,内存情况,方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)等。

1)插件安装

VisualVM 基于NetBeans平台开发工具,它具备通过插件扩展功能的能力,有了插件扩展支持,VisualVM可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
  • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)
  • dump以及分析堆转储快照(jmap、jhat)
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈
  • 其他插件带来的无限可能性

可以从工具选项中打开插件面板安装所需的插件:

JVM调优工具详解(9大主流调优工具)-mikechen

2)监视面板

在左边选择需要监控的程序,右边就可以可查看CPU、堆、线程等波动情况,也可以直接在这里进行手动 GC 和堆 Dump 操作。

JVM调优工具详解(9大主流调优工具)-mikechen

3)线程面板

可看到所有的线程,以及线程的运行状态。点击面板的线程 Dump 按钮,可以查看线程瞬时的线程栈。(通过 jstack 也可以抓取线程栈)

JVM调优工具详解(9大主流调优工具)-mikechen

4)GC面板

可以很方便的看到GC趋势图。(也可使用 jstat 工具监控)

JVM调优工具详解(9大主流调优工具)-mikechen

5)分析堆转储快照

通过左上角装入快照按钮打开 dump 的堆转储文件,就可以分析堆转储快照了。

JVM调优工具详解(9大主流调优工具)-mikechen

JVM调优工具详解(9大主流调优工具)-mikechen

MAT — 分析堆转储文件

我们使用 jmap 命令 dump 下来的堆转储文件可以使用 MAT 来分析,可以分析创建了哪些对象,然后分析对象的引用链,找出问题所在。MAT 下载地址:
http://www.eclipse.org/mat/downloads.php

MAT 主要功能:

  • 找出内存泄漏的原因
  • 找出重复引用的类和jar
  • 分析集合的使用
  • 分析类加载器

JVM调优工具详解(9大主流调优工具)-mikechen

GCeasy — 在线分析GC日志

GCeasy 是一款在线版的非常直观的 GC 日志分析工具,我们可以将日志文件压缩之后,上传到 GCeasy 官网即可看到非常清楚的 GC 日志分析结果。

JVM调优工具详解(9大主流调优工具)-mikechen

JVM调优工具详解(9大主流调优工具)-mikechen

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法