3、JVM性能调优
性能优化三部曲
- 性能监控:就是发现问题
- 性能分析:就是排查问题
- 性能调优:解决问题
监控诊断工具-命令行
jps
jps
查看正在运行的java进程id-q
只显示进程id-l
显示运行程序的全类名(如果是jar包,显示全路径)-m
显示传递main方法的参数-v
显示进程启动的参数,如:-Xms20m
jstat
jstat
查看JVM统计信息-
-<option>
有以下选项:-
-class:显示类加载相关信息
-
-compiler: 显示JIT编译过的方法,耗时
-
-printcompilation:显示已经被JIT编译过的方法
-
-gc:显示和GC相关的堆信息
-
-gccapacity: 和-gc基本相同,主要关注堆的最大最小空间
-
-gcutil:和-gc基本相同,主要关注使用栈空间占总空间百分比
-
-gccause:和-gcutil功能一样,但会输出最后一次GC发生的原因
-
-gcnew:显示新生代GC
-
-gcnewcapacity:和-gcnew一样,但主要关注使用最大最小空间
-
-geold:显示老年代GC
-
-gcoldcapacity:和-gcold一样,但主要关注使用最大最小空间
-
-gcpermcapacity:显示永久代使用最大最小空间
-
-
[-t]
输出信息前加上Timestamp列,显示程序运行实际,单位是秒 -
[-h<lines>]
h就是表示表头的意思,每隔3条数据打印一个表头 -
[<interval> [<count>]]
如果只写1000,就是每一秒打印一次,一直打印
如果带上10,就打印够10次,就不打印
-
jinfo
- jinfo:可以查看和修改虚拟机配置信息
- -sysprops 进程id:可以查看程序配置属性信息
- -flags 进程id:查看曾经赋值过的参数
- -flag 具体参数 进程id:查看某个java程序具体参数值,比如,是否使用GC
- -flag 【+】或【-】具体参数 进程id:修改参数,比如:修改配置,打印GC信息
- -flag 具体参数=具体参数配置值 进程id:修改配置参数的值,比如:修改堆大小100为90
jmap
- jmap:可以获取堆的映射快照文件,也可以获取java进程的内存信息。
- -dump:生成快照文件,如果是-dump:live 就会只保存存活对象
- 手动方式:-dump:format-b,file=【输出路径】 进程id
一般生成上使用-dump:live 只排查存活的对象就行了,不然这个hprof文件很大 - 自动方式:
-XX:+HeapDumpOnOutOfMemoryError
和-XX:HeapDumpPath=【输出路径】.hprof
这两个配置直接在家类的启动配置上就可以了,如果出现OOM,就会自动生成文件
- 手动方式:-dump:format-b,file=【输出路径】 进程id
- -heap:输出整个堆的详细信息,包括GC和内存使用的信息
- -histo:输出对象统计信息,如果是-histo:live 就只统计存活对象
- -dump:生成快照文件,如果是-dump:live 就会只保存存活对象
jhat
- jhat:
因为使用jmap导出的dump文件是二进制的,正常时没法看的,所以需要jhat工具搭配使用。
使用jhat命令,就启动了一个http服务,端口是7000,本地访问:localhost:7000 就可以在这里解析,jhat在jdk9、10,以及被删除了,官方建议使用VisuslVM。- jhat 【文件路径】:解析hprof文件
显示Server is ready 服务已准备好,然后访问localhost:7000
- jhat 【文件路径】:解析hprof文件
jstack
- jstack:打印JVM线程快照
- 加上进程id:
- -l:显示关于锁的附加信息
- 加上进程id:
jcmd
- jcmd:多功能命令行
- -l: 列出所有JVM进程,直接光jcmd也是一样的效果
- 进程id help:显示该进程id支持的所有指令
- 进程id 具体命令:使用
jcmd 进程id help
查看命令后,使用支持进程的所有指令
- -l: 列出所有JVM进程,直接光jcmd也是一样的效果
GUI工具
JDK自带的工具
jconsole
查看JAVA应用程序概况,监控堆信息、永久区或元空间的使用情况,类加载情况。
找到jdk安装目录的bin目录,双击点开就行
Visual VM
查看JAVA应用程序详细信息。
生成堆dump文件:对准程序右键弹出
如果想要保存这个dump文件,对这个文件右键,另存为
想要打开dump文件,左上角 文件,选择 装入
然后文件类型默认的要做选择
点击打开
线程分析:
CPU和内存 抽样器
点击CPU,会显示占用cpu时间比较长的方法,及占用时间的多少
点击内存,显示哪些结构占用的字节数比较多
第三方工具
JProfiler
商业工具,需要付费,功能强大。
安装好JProfiler 以后,打开idea,下载插件JProfiler
安装好JProfiler插件后,在左下栏找到Tools -> JProfiler
然后找到安装的JProfiler安装位置的exe启动文件,这样idea就和JProfiler关联起来了
idea启动项目时候直接点击JProfiler启动就好了
启动后就可以看到效果了
主要检测的时摇杆、CPU、线程
Arthas
Alibaba开源java诊断工具,国内很流行。
上面的工具比如:Visual VM 或者 JProfiler 都只适合项目上线之前在本地调试,如果项目部署在服务器,需要远程连接,需要配置参数,也要有相应的管理员给开通网络通道等,所以这个时候使用Arthas 就好多了。
Arthas(阿尔萨斯)是Alibaba开源的java诊断工具,排查问题无需重启,动态跟踪java代码,实时监控jvm。
使用:https://arthas.aliyun.com/zh-cn/
下载:https://arthas.gitee.io/arthas-boot.jar
windows系统的话,直接下载本地就好了,linux系统服务器上面的话上传上去就好了
启动方式1:
直接java -jar arthas-boot.jar
就可以了,显示所有java进程
先测试几个指令,比如先输入dashboard
:
显示进程的相关情况,还在实时监控,快捷键ctrl + c
就停止了
再输入thread
,就会显示线程信息:
如果要退出arthas 的话,输入exit 就好了
启动方式2:
java -jar arthas-boot.jar 进程id
:监测指定java进程
还可以通过浏览器访问,ip + 8563端口
相关指令
运行时参数
参数选项类型
标准参数选项
以-
开头,比较稳定,后期基本不会变化
cmd 打开命令行端口,输入java -help
可以看到很多 - 开头的参数选项
-X 参数选项
以-X
开头,功能比较稳定,但官方说后续版本可能会变更
命令行输入java -X
就可以看到所有-X的参数选项
很多-X 选项的参数等价于-XX 选项的参数
-XX 参数选项
以-XX
开头,属于实验性的,不太稳定,是使用最多的参数类型
-XX:+【选项】
:表示启用选项属性
-XX:-【选项】
:表示禁用选项属性
属性值为数字,比如:
-XX:InitalHeapSize=100m
,设置堆初始化大小100m,当然也可以使用-Xms100m
来代替,是等价关系的。
属性值为字符串的,比如:
-XX:HeapDumpPath=/usr/local/heapdump.hprof
,来指定导出hprof文件的路径,配合下面的几个指令使用
-XX:HeapDumpOnOutOfMemoryError
,出现OOM异常时候,会自动产生.hprof文件
-XX:HeapDumpBeforeFullGC
,要执行FullGC之前,生成转储文件
GC日志相关参数设置
-XX:PrintGC
:输出简化的GC日志
-XX:printGCDetails
: 输出GC进行垃圾回收时的详细日志,并在进程退出时输出内存各区域分配情况
-XX:+PrintGCTimeStamps
: 输出GC发生时的时间戳
-XX:+PrintGCDateStamps
: 输出GC发生时的时间戳,以日期格式显示
-XX:+PrintHeapAtGC
: 每一次GC前后,都打印堆信息
-Xloggc:【路径】
把GC日志写入到一个文件中,不会打印在输出