JVM 日常调优总结起来就是:首先通过 jps 命令查看当前进程,然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数,通过 jstat 命令查看 class 的加载信息以及 GC 信息,通过 jstack 命令查看线程堆栈信息,通过 jmap 命令查看堆内存信息。用以上的命令查看可以解决一些问题,但是对于 GC 日志以及 dump 文件不便于分析,因此下面介绍几个常用的图形化界面工具。

1

JDK 自带工具(jdk/bin 目录下)

常用 JVM 调优工具_Java

1、jconsole

查看 java 应用程序的运行概览、监控堆信息,可以监控Java应用程序的内存使用情况、线程状态、CPU占用率等。

cmd 里输入 jconsole,或者 jdk/bin 目录下点击 jconsole.exe 打开 jconsole 工具,如下图:

常用 JVM 调优工具_Java_02

可以对本地进程或者远程进程,连接之后可以进行 JVM 信息查看:

常用 JVM 调优工具_Java_03

2、jvisualvm

jvisualvm 工具在 Java 内存模型章节介绍过了,它是一个免费的Java虚拟机监视、分析和调试工具,可以监控Java应用程序的内存使用情况、线程状态、CPU占用率,可以监控 java进程的 CPU、堆、类以及线程等情况。

常用 JVM 调优工具_tomcat_04

点击线程Dump按钮,如下:

常用 JVM 调优工具_jvm_05

3、以上的工具可以通过远程连接 Linux 环境,进行远端 tomcat 监听

1、要想让服务器上的 tomcat 被连接,需要修改一下 tomcat 目录 bin/catalina.sh 文件中 JAVA_OPTS 参数,在参数后面添加以下内容:

cd usr/local/tomcat/tomcat-8/

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access 
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password

2、在 tomcat 目录 conf/ 文件中添加两个文件 jmxremote.access 和 jmxremote.password,一个是账号的权限,一个是账号密码,并给这 2 个文件授予可读写权限:

chmod -R 600 jmxremote.access

chmod -R 600 jmxremote.password

jvisualvm 连接远端 tomcat 进程:

1、在 jvisualvm 中选中“远程”,右键“添加”

2、主机名上写服务器的 ip 地址,比如 66.xxx.xxx.xxx,然后点击“确定”

3、右键该主机“66.xxx.xxx.xxx”,“添加 JMX 连接”,表示通过 JMX 技术连接远端服务器的 Java 进程

4、在“添加 JMX 连接”界面中“连接”里输入“66.xxx.xxx.xxx:8989”,勾选“使用安全凭证”,输入用户名和密码,点击确定进行远端连接。

2

Arthas 

常用 JVM 调优工具_jvm_06

Arthas是Alibaba开源的Java诊断工具。Arthas主要包含Command和IDE两种模式,同时也包含JDK和JVM调试、类信息、线程分析、系统信息、多线程诊断、GC分析、应用性能监控、堆栈分析、方法体分析、JVM参数调整、线上问题定位等功能。

下载arthas-boot.jar,然后用java -jar的方式启动:

curl -O https://arthas.aliyun.com/arthas-boot.jar

java -jar arthas-boot.jar

具体可参考:

https://github.com/alibaba/arthas

https://github.com/alibaba/arthas/blob/master/README_CN.md

3

Java堆分析器 MemoryAnalyzer(MAT)

常用 JVM 调优工具_jar_07

Java堆分析器Memory Analyzer(MAT,Memory Analyzer Tool)是一种用于分析Java堆的强大工具。MAT是一个开源工具,可以与Eclipse集成使用,也可以作为独立的命令行工具使用。它由Java开发,可以在任何支持Java的平台上运行。

MAT的主要功能包括:

快速查找和比较不同heap dump文件。导出报告和分析结果,包括CSV、Excel、XML和HTML格式。

Eclipse 的 MAT 插件 MemoryAnalyzer 用于分析堆内存泄漏,下载地址:https://www.eclipse.org/mat/downloads.php。

常用 JVM 调优工具_jvm_08

下载以后解压,我们可以运行 mat 目录下的 MemoryAnalyzer.exe,用它打开 Heap Dump 文件,以便于我们进行分析堆内存泄漏问题,如下:

常用 JVM 调优工具_jar_09

Histogram:查看内存中的每个类的对象实例、对象的个数及其大小

Leak Suspects:查看内存泄漏的可能原因

Top Consumers:查看大对象

在类名上右键--->List Objects--->with incoming references 可以列出该类的实例,如下:

常用 JVM 调优工具_jar_10

在类名上右键--->Merge Shortest Paths to GC Roots--->exclude all phantom/weak/soft etc.references 可以看到 GC Root 以及没有垃圾回收的原因,如下:

常用 JVM 调优工具_Java_11

大家可以自己研究一下。

4

在线分析网站 perfma

常用 JVM 调优工具_Java_12

官方网址:https://perfma.com

Java 虚拟机参数分析:https://club.perfma.com/topic/product-opts

Java 线程 Dump 分析:https://club.perfma.com/topic/product-thread

Java 内存 Dump 分析:https://club.perfma.com/topic/product-memory

大家可以自己研究一下。

5

GC 日志分析

常用 JVM 调优工具_tomcat_13

通过以下命令开启 GC 日志打印,拿到 GC 日志以后,就可以用工具进行进一步地分析了。

-XX:+PrintGCDetails:打印 GC 详细信息

-XX:+PrintGCDateStamps:在每个 GC上打印日期戳

-XX:+PrintGCTimeStamps:在每个 GC 上打印时间戳

-Xloggc:指定 GC log 的位置和日志文件名称

在运行程序时,为了快速发生内存溢出,设置内存为 10M
-Xms10M -Xmx10M 


设置以下的参数,可以开启 GC 日志打印
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps 
-Xloggc:d:/dump/gc.log

GC 日志在线分析网站 gceasy:https://gceasy.io/

常用 JVM 调优工具_tomcat_14

GC 日志本地分析工具 gcviewer:

具体可参考:https://github.com/chewiebug/GCViewer

下载地址:https://sourceforge.net/projects/gcviewer

双击下载的 gcviewer-1.37-SNAPSHOT.jar 文件可打开分析界面,选择 gc 日志文件打开即可,如下:

常用 JVM 调优工具_jvm_15

后面将为大家介绍 JVM 调优实例。