Java性能问题总结工具篇
一、Jprofiler
当我们被安排分析一个性能问题时,可能对整个系统了解地不多,已经来不及分析代码了,这时候最好地工具就是jprofiler。其他开发语言也有类似的profiler工具。
jprofiler可以远程连接一个JVM,告诉我们用了多少内存、启动了多少线程、哪些线程在忙、线程在忙什么。遇到内存问题时,jprofiler也能告诉我们哪些内存在增长,我们根据一些统计信息判断是否出现了内存泄漏。
特别适合压力测试时流程比较长、或者对系统不了解时,快速定位。
二、Jdk command
使用Jprofiler有很多限制,比如需要远程连接JVM。如果问题出现在一个商用场景,我们就没有这个条件。这个时候,就只能依靠Jdk自带的工具。
一般长用的有jstack、jstat、jmap。jstack可以查看线程堆栈信息,特别适合用来解决死锁问题。jstat可以显示JVM内存分配信息,jmap用来生成堆内存快照和统计信息。我曾经用jmap -histo快速定位出一个内存增长问题。
但这些命令不适合发现性能的瓶颈。
三、日志
日志的优势在于精确、使用各种场景,劣势在于需要修改代码。
有时候一个数据处理流程并不是很长,同时又是多线程处理,使用jprofiler和jdk command,都不能很好地卡住时间点,也不能展现出处理过程中数据的变化,这时就需要添加日志。
添加什么样的日志呢?
-
在合适的位置打印出某段流程的耗时。
-
数据中哪些关键变化,比如查询数据库耗时多少、查询出多少数据。
-
哪些数据走了A流程,哪些数据走了B流程,比例多少?
四、Jmeter
Jmeter是apache的一款专门用于测试的工具,功能强大,可以用来触发流程,特别适合复现问题、验证问题。
支持协议
最初是用来测试Web应用,后来逐渐扩展,现在可以测试很多协议,比如Http、Https、FTP、带JDBC的数据库、LDAP、消息中间件、邮件、TCP等。
测试流程设计
Jmeter的底层代码是Java,我们可以在测试用例中进行Java编程,实现复杂的测试流程。
比如第一步发送一个REST请求,得到请求结果,第二步使用Java代码判断请求结果是否正确,第三步,再根据第二步的情况执行REST请求或其他交互流程。
重复、多线程执行测试流程
性能测试时,我们需要长时间、高频率地触发流程,Jmeter支持设置测试次数,甚至永久测试,满足性能测试对时间和次数的要求。Jmeter还支持多线程并发测试,还支持同时进行多个测试流程,每个测试流程都是并发测试。
像这种性能问题、内存问题,一般不会经常出现,一旦出现,就很重要紧急。
工欲善其事必先利其器,想要成为高级程序员,一定要学会怎么快速定位这种问题,一定要不断升级自己的工具箱。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报