性能测试简单分析(二)

性能测试之后,需要分析性能问题瓶颈所在,最常见的情况,除了cpu指标过高。还有就是内存占用过高,特别是java服务,这是最常见和关注的问题。

简单分析流程
1:看占用资源大的进程,判断是哪个java程序出现瓶颈
2:如果是jvm相关,使用jmap -pid 先查看jvm哪个区存在内存泄露,比如,一个常见的内存错误就是java.lang.OutOfMemoryError: PermGen space,这个就是持久代内存溢出。(关于jvm,可以单独来讲分析调优,这里不展开)
3:使用jstat -gcutil pid 是否有gc导致,分析线程站,看大部分线程在做什么;在测试环境中进行打压,进行复现,若无法复现,分析OS、应用程序的日志
4:使用jmap -histo:live [pid] >a.log,这是很重要常用的命令分析,可以查看当前Java进程创建的活跃对象数目和占用内存大小,它有可能是造成内存泄漏的主要原因
5:如果上面无法详细分析爱出来具体情况,或者线上环境,可以采用jmap -dump:live,format=b,file=filename PID导出整个堆栈信息,然后通过端口访问,具体一步步定位,导出来的信息可以用专门的内存分析工具(例如:MAT)来分析。
6:可以借助工具,比如jconsole,神器jprofile,分析内存情况。

最后附带总结下
java排查内存故障的方法和技巧有哪些
1、jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
2、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。
3、jstack pid 查看stack信息,知道 java 程序是如何崩溃和在程序何处发生问题 , jstack –l [pid]命令 dump java线程栈的情况,将以上线程id转换成16进制,后在dump出来的jstack文件中搜索

补充:

无论对比java还是c++服务,内存泄露都是要持续关注的,所以这里强烈建议在服务所在环境部署轻量级监控工具,比如经典的nmon,但是公司环境有时候没有权限去安装工具,这个时候,就要充分借助shell脚本。

可以用shell写一个简单的脚本,具体逻辑是:每次运行,就用命令记录当下服务所占用的内存等关键指标。保存好脚本。然后用cron 设定定时任务,或者更舒服的,可以在自己本机搭建jenkins,设定定时执行shell脚本。

然后晚上放着跑一晚上稳定性测试,第二天上班过来看记录的日志,这样的好处的是,除了可以看到是否存在内存泄露,还能看到在这个持续过程中,内存的变化是否出现过异常的波动。

猜你喜欢

转载自blog.csdn.net/weixin_43044440/article/details/114825157
今日推荐