核心内容摘要
玖玖视频精彩内容推荐:一场关于视听美学的深度漫游
目录导读前言
Python编程入门到精通
接口自动化项目实战
Web自动化项目实战
App自动化项目实战
一线大厂简历
测试开发DevOps体系
常用自动化测试工具
JMeter性能测试
九、
总结尾部小惊喜前言
性能测试-内存溢出问题定位和分析堆内存溢出1稳定性压测一段时间后jmeter报错日志报java.lang.OutOfMemoryError.Java heap space。
2用jmap -histo pid命令dump堆内存使用情况查看堆内存排名前20个对象看是否有自己应用程序的方法从最高的查起如果有则检查该方法是什么原因造成堆内存溢出。
3如果前20里没有自己的方法则用jmap -dump来dump堆内存在用MAT分析dump下来的堆内存分析导出内存溢出的方法。
4如果应用程序的方法没有问题则需要修改JVM参数修改xmsxmx调整堆内存参数一般是增加堆内存。
栈内存溢出1稳定性压测一段时间后jmeter报错日志报Java.Lang.StackOverflowError。
2修改jvm参数将xss参数改大增加栈内存。
3栈溢出一定是做批量操作引起的减少批处理数据量。
持久代溢出1稳定性压测一定时间后日志报Java.Lang.OutOfMemoryError.PermGen Space。
2这种原因是由于类、方法描述、字段描述、常量池、访问修饰符等一些静态变量太多将持久代占满导致持久代溢出。
3修改jvm配置将XX:MaxPermSize256参数调大。
尽量减少静态变量。
线程死锁1容量测试压测一段时间后LR报连接超时。
2造成这种现象的原因很多比如带宽不够中间件线程池不够用数据库连接池不够连接数占满等都会造成连接不上而报超时错误。
3jstack命令dump线程栈搜索线程栈里有没有block如果有的话就是线程死锁找到死锁的线程分析对应的代码。
数据库死锁1容量测试压测一段时间后LR报连接超时。
2造成这种现象的原因很多比如带宽不够中间件线程池不够用数据库连接池不够连接数占满等都会造成连接不上而报超时错误。
3数据库日志中搜索block能搜到block的话就是存在数据库死锁找到日志查看对应的sql优化造成死锁的sql。
常见单业务场景和混合业务场景性能bugbug1我之前做压力测试压测一段时间后频繁的报连接超时和socket close套接字关闭原因当时我们分析是因为Tomcat中间件线程池不够用数据库连接池也不够并且连接数也被占满了导致我们连接不上而报超时和套接字关闭等错误性能bug2还有一次就是我在做压测的时候我用50并发压测TPS曲线正常应该是平缓的但是TPS曲线剧烈下降和抖动并且一直持续定位问题当时我在服务器端用的jheap和dstat命令监控发现是因为jvm进行垃圾回收的时候老年代空间也满了引发了fullGC然后导致我们线程暂停了进行垃圾回收后面解决这个问题的话是我们开发同事把那个老年代的空间进行了增加修改了JVM参数并且增加了堆内存xms和xmx后面fullGC频率就变低了很多。
性能bug3稳定性压测一段时间后jmeter报错日志报堆内存溢出OutOfMemoryError后面我们开发同事把JVM的参数改了一下增加堆内存把xms和xmx都调大了就没报错了性能bug4压测一段时间后jmeter报错日志报栈内存溢出StackOverflowError。
后面我们开发同事把JVM的参数改了一下增加栈内存把xss参数改大了后面就没报错了性能bug5有次压一个查询接口的时候发现接口的平均响应时间非常的长后面定位发现是因为在数据库用联合索引的时候作为查询条件的那个字段没有放在查询条件的最左前缀导致索引失效了后面变成了全表扫描后面我们给字段加了唯一索引查询时间就提高了很多性能bug6我有次压测的时候发现应用服务器的CPU达到90%并且还是8核的CPU当时就觉得有很大的问题后来通过jprofiler工具对CPU进行了监控发现有个谷歌开发的gson库在调用的时候对CPU的消耗非常的大当时把这个问题反馈给到了开发开发同事那边把这个谷歌的gson库换成了阿里巴巴的fastJSON后发现性能好了不止一倍CPU的占用只有20%、并且tps也提升上来了性能bug7当时碰到过一个最难的性能bug就是压测一段时间后线程直接不动了并且TPS直接为0了但是呢服务器硬件的资源CPU和内存 IO等等又都是非常空闲的、通过JDK自带的jvisualvm工具我在查看线程的时候发现至少有2个线程一直处于红色的阻塞状态后来在查看报错日志的时候发现有个CaseController类报错了、然后去看一下Java代码、发现代码里面一个锁synchronized里面又嵌套了另外一个锁后面我们研发同事看了之后改了一下代码把Thread.sleep()线程等待和锁里面加锁的代码给优化了后续就没问题了性能bug8有次我在做压测的时候发现TPS就是上不去然后呢通过用dstat -tcmnd --disk-util 命令去监控的时候发现CPU的使用率始终没有很大的波动、空闲95%左右、只占用了5%左右、当时就觉得应该不是fullGC和youngGC 内存泄露和内存溢出的问题。
为了进一步的排查和定位我后面通过通过jstack 进程号
log命令去获取对应的日志、看一下是不是线程阻塞的问题然后把捕捉的日志下载到本地用notepad打开、发现Thread.statBlocked阻塞的地方多达70多个地方。
后面又通过反编译工具把log4j的jar包打开、找到了Category.class这个类、发现里面的第204行调了一个方法叫做callAppenders里面用了synchronized的锁原因找到了是log4j里面为了保证线程的安全里面加了很多的锁但是却牺牲了很多的性能后面我们优化的时候就是首先进入项目中找到log4j.properties这个文件然后把log4j.rootLoggerinfo 中的info改为error、提升打日志的等级然后重启项目这个进行优化之后、重新压测发现TPS达到了7000/sec 、优化阻塞之后发现性能提升了3倍左右、CPU也占用了15%左右。
当然也可以用log4j2打日志因为这个log4j2在原来的log4j的基础上做了重构做了性能的优化、做了异步处理比log4j和logback有了18倍的性能的提升性能bug9在做压力测试的时候吞吐量tps上不去原本的TPS标准是要达到400/sec但是实际压测只有50多的tps后面发现是数据库的磁盘空间满了导致查询速度和请求速度过慢然后我让我们后端开发同事把数据库的磁盘清理一下就恢复正常了。
性能bug10我在压测修改密码新建用户投保用户列表接口保单管理接口支付接口保单查询接口查看险种接口投保接口接口的时候【这里面接口自己选一个】平均响应时间在10s左右不符合性能指标3s后来发现原因是接口通过redis每次请求redis都会初始化后面我们在测试环境增加路由配置之后这个问题就解决了完整版企业级性能测试实战速通Jmeter性能测试到分布式集群压测教程下面是我整理的2026年最全的软件测试工程师学习知识架构体系图
Python编程入门到精通
接口自动化项目实战
Web自动化项目实战
App自动化项目实战
一线大厂简历
测试开发DevOps体系
常用自动化测试工具
JMeter性能测试
九、
总结尾部小惊喜人生最动人的风景往往藏在最难攀爬的高处。
当你觉得力竭时请记住每一次坚持都在雕刻更强大的自己。
别问路有多远只管迈步向前别怕山有多高向上攀登就是答案你体内沉睡着改变世界的力量每个清晨都是改写命运的新机会每次挫折都是精心包装的礼物。
当全世界都在说不可能时正是你证明可能的最好时机