查消耗cpu最高的进程PID
- top -c
- 按P,进程按照cpu使用率排序
根据PID查出消耗cpu最高的线程号
- top -Hp 进程号
- 按P,进程按照cpu使用率排序
- 将最高的十进制线程号转为十六进制
根据线程号查出对应的java线程,进行处理
- jstack -l pid > pid.test
- cat pid.test | grep ‘十六进制线程号’ -C 8 或者直接less进去看
可以看出,如果想要提高性能,可以从SimpleDateFormat性能上入手,换成DateTimeFormatter。
使用arthas和jstat与jmap
https://alibaba.github.io/arthas/quick-start.html
案例1
从上面可以看到大部分都在内存几乎都满了,通过jstat或者arthas都可以看到。通过jmap看到大部分的内存集中在字符,应该是序列化和逆序列化堵了,而且线程结果可以看到,多次采样,在SimpleDateFormat上性能消耗很多。
将SimpleDateFormat换成FastDateFormat.本地测试,后者性能比前者高一倍。
其次,调整jstorm内部的资源分配,不是一味的增加资源就能解决问题,资源分配对内存的分配至关重要。
案例2
很明显可以看到,这个Channel类,在内存中不下百万个实例,频繁的gc会导致程序性能不行。
内存dump
导出整个JVM 中内存信息1
jmap -dump:format=b,file=文件名 [pid]
通过mat分析堆栈信息。