JAVA性能优化小结

工具篇:
首先arthas工具的
一:trace命令:
trace --skipJDKMethod false cn.com.zhimo.MainEntry main
内部类
trace --skipJDKMethod false cn.com.zhimo.MainEntry$InnerClass hello
1、这个命令,对性能消耗比较大,所展示的时间,跟真实的时间可能相差较大。但是可以做横向比较
2、这个命令抓的是wall时间,包括抢锁、网络、IO
3、对于i++的,无法统计,因为它不是方法调用。
4、可以加-n 5参数,限定采集次数。

二:CPU火焰图
profiler start
profiler stop --file /home/zhimo/cpu.html
也可以不加--file,但是要有权限写文件。
1、这个只可以抓CPU消耗。它的原理是周期抓调用栈,谁的样本多,概率上就说明,谁占用多。
2、抢锁、网络、IO,不能体现在这个里面。

三:WALL火焰图
profiler start -e wall
profiler stop --file /home/zhimo/wall.html
1、这个抓的是WALL时间。抢锁、网络、IO都会体现其中。
2、虽然CPU使用得更多,但个人认为WALL也必须看

思路篇:
肯定极不完整了。

  1. 调用逻辑改造:单线程,串行处理一批消息。可以在中间加阻塞队列作为消息缓冲。这样相当于两个线程并发地处理。
    2、中间的阻塞队列,优先使用ArrayBlockingQueue
    3、不要忘记原始的打日志的方式。这种方式最可靠,最能说明问题。
    4、耗时的方法,重复调用(在CPU图上可以看出来),尽量避免正则等操作。

教训:
1、当任务工作时间小于1ms,基于小于1ms。那并发起来并不一定有好的效果。因为并发调度本身也要消耗一些性能。
2、一定要从大的架构开始分析。比如先消息源头的性能,再分析内部逻辑

其它arthas工具(学习了,但是这次没有使用)
1、watch命令
trace关心的是调用耗时,而watch关心的是数据,入参、返回值、异常、也可以观察耗时 等等。
watch后面有两个字符串参数,一个是我想观察的哪些数据,比如入参、返回值 。另一个是条件,在什么情况下观察。比如根据以耗时为条件,以某个入参为条件。
还有一个点,类似面向切面编程,可以在执行前观察,还是返回后,还是抛异常后。

2、tt命令(time tunnel时光隧道)
一言以蔽之,把执行的现场保存下来,事后再分析。同时,还可以拿当时的参数,再调用一次。就像时光隧道一样,回到过去。
既然要保存现场,就要消耗内存,所以要注意,清理内存。
保存下来之后,可以再用-i等参数,观察某一次调用的细节。
再次调用的时候,保存的对象只是缓存了对象的引用。内容可能已经变了,要注意。

posted @ 2026-01-05 10:38  知末  阅读(10)  评论(0)    收藏  举报