点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~
JVM 日常调优总结起来就是:首先通过 jps 命令查看当前进程,然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数,通过 jstat 命令查看 class 的加载信息以及 GC 信息,通过 jstack 命令查看线程堆栈信息,通过 jmap 命令查看堆内存信息。用以上的命令查看可以解决一些问题,但是对于 GC 日志以及 dump 文件不便于分析,因此下面介绍几个常用的图形化界面工具。
1
JDK 自带工具(jdk/bin 目录下)
1、jconsole
查看 java 应用程序的运行概览、监控堆信息,可以监控Java应用程序的内存使用情况、线程状态、CPU占用率等。
cmd 里输入 jconsole,或者 jdk/bin 目录下点击 jconsole.exe 打开 jconsole 工具,如下图:
可以对本地进程或者远程进程,连接之后可以进行 JVM 信息查看:
2、jvisualvm
jvisualvm 工具在 Java 内存模型章节介绍过了,它是一个免费的Java虚拟机监视、分析和调试工具,可以监控Java应用程序的内存使用情况、线程状态、CPU占用率,可以监控 java进程的 CPU、堆、类以及线程等情况。
点击线程Dump按钮,如下:
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
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)
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。
下载以后解压,我们可以运行 mat 目录下的 MemoryAnalyzer.exe,用它打开 Heap Dump 文件,以便于我们进行分析堆内存泄漏问题,如下:
Histogram:查看内存中的每个类的对象实例、对象的个数及其大小
Leak Suspects:查看内存泄漏的可能原因
Top Consumers:查看大对象
在类名上右键--->List Objects--->with incoming references 可以列出该类的实例,如下:
在类名上右键--->Merge Shortest Paths to GC Roots--->exclude all phantom/weak/soft etc.references 可以看到 GC Root 以及没有垃圾回收的原因,如下:
大家可以自己研究一下。
4
在线分析网站 perfma
官方网址: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 日志分析
通过以下命令开启 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/
GC 日志本地分析工具 gcviewer:
具体可参考:https://github.com/chewiebug/GCViewer
下载地址:https://sourceforge.net/projects/gcviewer
双击下载的 gcviewer-1.37-SNAPSHOT.jar 文件可打开分析界面,选择 gc 日志文件打开即可,如下:
后面将为大家介绍 JVM 调优实例。