> 代码有时会存在性能问题,除了用基准测试来验证代码性能外。有时会和环境有关联,总结一下在各环境验证性能。
---
### 本地性能查看
> 本地性能查看比较简单,一下步骤就行
- 安装jprofiler
- 启动idea执行服务
- jprofiler可以看到对应进程,点击进去就行
- 切换到CPU views视图,开启cpu监控
- idea就可以开始启动服务,接收请求
- cpu views查看hot spots就可以看到各个类、方法的耗时并可以导出查看,定位性能
> 这一类适用于监控持续性服务接收大量请求处理情况的查看。如果只是单纯的检测代码性能,采用基准测试会更好一些。
---
### linux下查看性能
> linux查看性能依赖于jdk和shell相关的工具。
1. jdk工具介绍
- jps:查看所有java进程,`jps`
- jstat: 查看堆信息详情,`jstat -gcutil pid`
- jinfo: 查看虚拟机参数,`jinfo -flag CMSInitiatingOccupancyFraction 2618`
- jmap: 导出堆文件,`jmap -dump:format=b,file=Desktop/dump.bin 2618`,`jmap -histo 8225`
- jhat: 堆分析工具,`jhat dump.bin`,生成http供查看
- jstack: 查看线程堆栈,`jstack pid`
- jstatd: 查看远程主机信息
- jcmd: 命令行工具
> 常用的是jmap查看堆文件,对于占用大量内存对象分析非常用。jstack查看有哪些对象耗用了大量cpu。
2. 运用`jstack`分析大量cpu占用进程
- 使用`jps`得到java进程,然后使用`top -Hp pid`得到该进程下所有线程:如下
``` Bash
top -Hp 16006
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 以上可以看到16049、16050、160513这3个占用最多,通过
printf "%x\n" 16049
可以获得16进制码3eb1
- 然后
jstack -l 16006 | grep -C5 '3eb1'
可以获得该线程对应代码信息
jstat
可以查看gc相关信息
jstat -gc pid time
垃圾回收统计
jstat -gccapacity pid time
堆内存统计
jstat -gcnew pid time
新生代统计
jstat -gcnewcapacity pid time
堆新生代内存统计
jstat -gcutil pid time
总结垃圾回收统计
arthas使用
- 搜索arthas即可下载zip包,然后解压
- java -jar arthas-boot.jar即可启动,选择对应的jvm进程进入命令行界面
thread -n 5
查看前五个消耗资源最多的线程,比jstack快很多
trace -n 10 net.opentsdb.utils.batch.HbaseBatchPut batchPut
统计该方法最近10次的耗时(特别有用,可查看详情)
tt -t -n 20 net.opentsdb.utils.batch.* batchPut
检测记录方法所有执行时间(比上一个更直观,只统计信息)
watch net.opentsdb.plugin.impl.LocalMetaCache increment "{params,target,returnObj}" -x 2
通过watch查看传入和传出信息,另类的debug
- 其他命令通过help command查看即可