10 调优工具
前面我们了解到了许多jvm命令以及参数,但是用命令还是不太方便,有没有可视化的工具呢?答案是肯定的
10.1 jConsole
jConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行状态,监控堆信息,永久区使用情况,类加载情况等。
命令行输入: jconsole
10.2 jvisualvm
10.2.1 监控本地java进程的CPU,类,线程等
10.2.2 监控远程java进程
如监控tomcat,部署在阿里云上tomcat
-
在visualvm中选中“远程”,右击“添加”
-
主机名上写服务器ip地址,然后点击 “确定”
-
右击该主机“39.100.XX.XX” ,添加“JMX”[也就是通过JMX技术具体监控远端服务器哪个java进程]
-
要想让服务器上的tomcat被连接,需要改一下
bin/catalina.sh
这个文件注意下面的8998 不要和 服务器上其他的端口冲突
JAVA_OPTS="$JAVA_OPTS-Dcom.sun.management.jmxremote-Djava.rmi.server.hostname=31.100.39.63-Dcom.sun.management.jmxremote.port=8998 -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"
-
在…/conf文件中添加两个文件
jmxremote.access
和jmxremote.password
,并授予权限:chmod 600 *jmxremot*
jmxremote.access
文件配置: 用户权限
guest readonly
manager readwrite
jmxremote.password
配置文件: 配置 管理员 与 普通用户 用户名密码
guest guest
manager manager
-
将连接服务器地址改为公网ip地址
#查看输出情况 hostname-i # 输出 172.26.225.243 172.17.0.3 # 更改 hosts文件: vim /etc/hosts # 修改 172.26.225.243 公网ip地址
-
设置上述端口对应的阿里云安全策略和防火墙策略
-
启动tomcat,来到bin目录 ,启动 tomcat
./startup.sh
-
查看tomcat启动日志以及端口监听
tail -f ../logs/catalina.out lsof -i tcp:8080
-
查看8998监听情况,可以发现多开了几个端口
#查看端口,得到PID lsof -i:8998 netstat-antup | grep PID
-
在刚才的JMX中输入8998端口,并且输入用户名和密码则登录成功
端口:8998
用户名:manager
密码:manager
10.3 Arthas
github地址::https://github.com/alibaba/arthas
以下摘录自:https://github.com/alibaba/arthas/blob/master/README_CN.md
Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
下载
arthas-boot.jar
,然后用java -jar
的方式启动:
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
打印帮助信息:
java -jar arthas-boot.jar -h
- 如果下载速度比较慢,可以使用aliyun的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
使用
as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车
执行即可:
curl -L https://alibaba.github.io/arthas/install.sh | sh
上述命令会下载启动脚本文件 as.sh
到当前目录,你可以放在任何地方或将其加入到 $PATH
中。
直接在shell下面执行./as.sh
,就会进入交互界面。
也可以执行./as.sh -h
来获取更多参数信息
10.4 Eclipse(MAT插件)
Java堆分析器,用于查找内存泄漏
Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照
下载地址:https://www.eclipse.org/mat/downloads.php
10.4.1 Dump信息包含的内容
-
All Objects
- Class, fields, primitive values and references(类,变量,引用)
-
All Classes
- Classloader, name, super class, static fields(类加载器,类名称,父类,静态变量)
-
Garbage Collection Roots(GC-Roots)
- Objects defined to be reachable by the JVM(JVM可访问对象)
-
Thread Stacks and Local Variables (本地变量和线程栈)
-
The call-stacks of threads at the moment of the snapshot, and per-frame information about local
objects(快照时刻的线程调用堆栈,以及关于本地对象的每个栈帧信息)
-
10.4.2 获取Dump文件
- 手动
jmap-dump:format=b,file=heap.hprof pid
- 自动
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
10.4.3 使用
-
Histogram(Histogram可以列出内存中的对象,对象的个数及其大小)
ClassName:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个 ShallowHeap:一个对象内存的消耗大小,不包含对其他对象的引用 RetainedHeap:是shallowHeap的总和,即该对象被GC之后所能回收到内存的总和
-
右击类名—>ListObjects—>withincomingreferences—>列出该类的实例
-
右击Java对象名—>MergeShortestPathstoGCRoots—>excludeall…—>找到GC
Root以及原因
-
-
Leak Suspects(查找并分析内存泄漏的可能原因)
Reports--->LeakSuspects--->Details
-
Top Consumers(列出大对象)
ClassName:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个 ShallowHeap:一个对象内存的消耗大小,不包含对其他对象的引用 RetainedHeap:是shallowHeap的总和,即该对象被GC之后所能回收到内存的总和
-
右击类名—>ListObjects—>withincomingreferences—>列出该类的实例
-
右击Java对象名—>MergeShortestPathstoGCRoots—>excludeall…—>找到GC
Root以及原因
-
10.5 IDEA(Jprofiler插件)
- 1、IDEA安装 JProfiler 插件
- 2、window上安装 JProfiler (https://www.ej-technologies.com/products/jprofiler/overview.html)
- 3、激活
- 4、在IDEA 中绑定 JProfiler (setting ->jprofile)
10.6 GC日志分析工具
具体GC分析工具使用后续更新,敬请期待
首先需配置下 GC日志:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps Xloggc:gc.log
- 在线查看
- http://gceasy.io
- GCView