目录
- 优化过程
- 问题排查
- 解决思路
- 实践案例
- 总结分析
- arthas的使用
- Arthas Dashboard:观察堆使用情况
- 使用Arthas Trace
- 使用Arthas Stack
- 使用Arthas火焰图
- 使用Arthas Thread
优化过程
问题排查
在我们的应用中,我们发现了一个性能问题。 具体来说,有某个方法的执行时间过长,导致了应用响应缓慢。 这个方法上层是一个大for循环,业务需要执行几十万次这个for循环的方法。 为了深入了解问题,我们首先使用了jstack工具来查看线程的执行情况。 通过jstack -l命令,我们可以获取到线程的调用栈信息,这有助于我们找到线程卡住的地方(当然也可以通过arthas的thread去抓取)
-
在多次抓取的数据中,我们发现了一个共同点:这个执行时间过长的方法上,执行到@Transaction注解才会执行的操作。 通常情况下,@Transaction注解是用来进行事务管理的,这意味着该方法内部的操作可能会涉及到数据库的读写操作。然而,根据我们的观察,这个方法并没有实际的数据库操作,它的主要操作是纯内存操作
堆栈数据.png

堆栈.png
解决思路
- 考虑到上述情况,我们认为这个方法的执行时间过长可能是由于事务管理导致的。 由于该方法没有实际的数据库操作,因此我们怀疑@Transaction注解可能是不必要的。为了验证这个想法,我们决定移除这个方法上的@Transaction注解,并重新设计代码以优化其性能
实践案例
- 在具体实施时,我们首先将该方法从原来的service类中移除,然后将其放入一个新的service类中。 然后,我们对新的service类进行了测试,以确保其正常工作且性能得到优化
总结分析
- 通过这次实践,我们发现@Transaction注解对方法的性能有一定影响。在使用时,我们应该确保其必要性,尤其是在没有实际数据库操作的方法上。此外,合理的设计代码和优化性能也是解决此类问题的关键。在未来的开发中,我们应该更加注意这些方面,以确保应用的性能和响应速度
arthas的使用
- CPU过高问题排查这边有提到arthas的安装
- Arthas,这是阿里巴巴开源的一款Java诊断工具,其名字取自于希腊神话中的阿童木。这个工具为开发者提供了一种快速、有效的调试方法,帮助他们解决在生产环境中遇到的复杂问题, Arthas为开发者提供了一种全新的Java诊断方式通过使用Arthas提供的各种工具和功能,开发者可以更快速、更有效地解决生产环境中遇到的问题。这不仅提高了开发效率,也提高了应用程序的稳定性和性能
Arthas Dashboard:观察堆使用情况
- Arthas Dashboard是一个强大的工具,可以实时查看应用程序的堆使用情况。通过它,开发者可以了解内存使用状况、线程活动等信息,从而更好地理解和优化应用程序的性能
使用Arthas Trace
- Arthas提供了强大的跟踪功能,可以帮助开发者跟踪应用程序中的方法调用、执行过程和结果以及执行时间, 可以很方便的定时执行时间慢的情况。通过使用特定的命令,如trace xxx.web.netty ServerDealOverall channelReadComplete和trace -E xxx.web.handler.XXXHandler|xxx.web.cache.ServiceCollectionCache realDeal|getUpdateConfigsTaskByKey,可以跟踪特定方法的执行过程,帮助找出问题所在
使用Arthas Stack
- Arthas Stack可以帮助开发者快速查看线程栈信息,从而更好地理解应用程序的运行状态。通过使用命令如stack class method,可以获取特定方法的线程栈信息
使用Arthas火焰图
- 火焰图是一种可视化工具,可以帮助开发者快速了解程序运行状况。Arthas提供了完整的火焰图支持,通过使用命令如profiler start、profiler getSamples、profiler status和profiler stop --format html,开发者可以轻松获取并分析程序的运行数据
使用Arthas Thread
- Arthas Thread可以帮助开发者查看和管理线程信息。通过使用命令如thread |grep xxx,开发者可以查找包含特定字符串的线程信息,更好地理解应用程序在运行时的线程状况
