> 代碼有時會存在性能問題,除了用基準測試來驗證代碼性能外。有時會和環境有關聯,總結一下在各環境驗證性能。
---
### 本地性能查看
> 本地性能查看比較簡單,一下步驟就行
- 安裝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查看即可