java性能权威指南一Java性能调优工具箱
前言
说来惭愧这本书是HeapDump社区,大概是23年的礼品吧,也是目前最后一本收到的技术书籍,以下是对这本书的学习笔记;
说到Java性能优化,有两个绕不开的前置条件:
-
关于对’不要过早优化’论点的误区
在这个一点上,个人理解是不要过早投入精力进行极致优化,例如0.99s的响应时间,投入大量精力优化到0.49s,投入和产出不成正比;
'过早优化’这个词语是高德纳最早提出来的,但是完整的原话是"我们不应该把大量的时间耗费在哪些小的性能改进上,过早优化是所有噩梦的根源",这不是我们编写复杂、混乱、晦涩代码的借口; -
性能测试的方法
性能测试有几个原则:
- 测试真实应用
- 理解批处理流逝时间、吞吐量和响应时间
这个指的是Java应用通常都会使用JIT-即时编译技术,因此需要运行一段时间后才能测试出真实的性能水平 - 同统计方法论应对性能变化
就算是计算机科学这一严谨的学科,在测试过程中也会出现毛刺现象,因此我们评估应用的性能指标一定是要基于统计学来进行分析;
简单介绍过前置条件后,下面进入主菜Java性能调优工具箱一节;
性能调优工具
操作系统的工具和分析
- CPU使用率
性能调优的目的是提高单位时间内CPU的使用率
常用的命令是有:
- vmstat [选项] [延迟时间] [次数]
- 磁盘使用率
目前来说磁盘读写相比CPU还是太慢太慢了,I/O阻塞是导致大部分程序性能无法提高的原因;
常用的命令有:
- isstat -xm 5
输出CPU使用情况、磁盘I/O统计信息,关键指标:%util-磁盘使用率、w_await-磁盘写入时间(毫秒)、%iowait-等待I/O的时间占比、wMB/s-磁盘每秒写入大小
- 网络使用率
网络使用率类似磁盘使用率,常用的命令有:
- netstat:netstat -a 显示所有活动的网络连接、netstat -l 显示所有正在监听的端口,新版本的Linux中使用命令ss进行替代;
- nicstat 5:%Util - 网络端口使用率、rKB/s 读取速度 、wKB/s 写入速度
JAVA监控工具
JDK自带工具
-
jcmd
用于打印VM的信息, -
jconsole
最早的JVM图形化性能监控工具 -
jhat
读取memory dump文件 -
jinfo
查看JVM的系统属性 -
jstack
转储Java进程的堆栈信息 -
jstat
提供GC和类装载活动的信息 -
jvisualvm
监控和分析JVM性能的工具
重点的命令有:
-
内存转储 (Heap Dump)
jmap -dump:format=b,file=heapdump.hprof
jcmdGC.heap_dump /heapdump.hprof -
线程转储 (Thread Dump)
jstack> threaddump.txt
jcmdThread.print > threaddump.txt