文章目录
1 性能优化的步骤
-
性能监控
-
性能分析
-
性能调优
2 性能评价指标
-
吞吐量
-
对单位时间内完成的工作(请求)量
-
在gc中,运行用户代码时间占总运行时间的比例
-
并发数
同一时刻,对服务器有实际交互的请求数 -
内存占用
java 堆区所占的内存大小
3 性能监控
3.1 查看当前运行的java进程
jps
-m 输出给虚拟机进程启动时传递给主类的参数
-v 列出虚拟机进程启动时的jvm参数
注意:进程的本地虚拟机id与操作系统的进程id是一致的
3.2 查看jvm统计信息
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
-
与类装载相关
-
class:显示ClassLoader相关信息:类的装载,卸载
-
垃圾回收相关
-
gc:显示与gc相关的堆信息
-
gcutil: 显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
3.3 怎样判断是否出现oom
-
我们可以比较java进程启动时间以及总gc时间(gct)比例,得出gc时间占运行时间的比例
-
比例超过20%,说明目前堆的压力较大,超过90%说明随时都可能抛出oom异常
命令为
jstat - gc -t pid 1000 10 表示的是每隔1000毫秒,进行显示进程号为pid的gc信息,共显示十次
3.4 jstat 判断内存溢出
-
使用jstat获取多行性能数据,取数据中ou列(即已占用的老年代内存)的最小值
-
获取多组ou最小值,如果呈现上涨趋势,则说明老年代使用量不断上涨,因此有可能存在内存泄露
3.5 实时查看并修改jvm参数配置
3.5.1 查看曾经赋过值的一些参数
jinfo -flags PID
3.5.2 查看某个java进程的具体参数的值
jinfo -flag 具体参数 PID
3.5.3 修改boolean类型的值
jinfo -flag [+][-] 具体参数 PID
3.5.4 针对非boolean类型的值
jinfo -flag 具体参数=值 PID
3.6 扩展
3.6.1 查看jvm参数启动的初始值
java -XX:+PrintFlagsInitial
3.6.2 查看所有jvm参数的最终值
java -XX:+PrintFlagsFinal
3.6.3 查看被用户设置过的详细信息
java -XX:+PrintCommandLineFlags
3.7 jmap 的使用
3.7.1 生成dump文件
jmap -dump
3.7.2 输出堆空间的信息
jmap -heap
3.7.3 输出堆中对象的统计信息
jmap -histo
3.7.4 怎样导出dump文件
- 主动使用
jmap -dump:format=b,file=<file文件> PID
抓取存活(常用)
jmap -dump:live,format=b,file=<file文件> PID
- 自动方式
常用在报oom时使用,导出应用程序的当前堆快照
-XX:+HeapDumpOnOutOfMemoryError
指定对快照的保存位置
-XX:HeapDumpPath=<filename.hprof>
3.8 jvm线程快照
jstack PID
主要有以下状态
-
死锁(Deadlock)
-
等待资源(waiting on condition)
-
等待获取监视器 (waiting on monitor entry)
-
阻塞 (blocked)
-
执行中 (runnable)
-
暂停 (suspended)
3.9 jcmd
jcmd 可以替换jmap
查看支持的操作
jcmd PID help