使用jmeter执行性能测试,报错:java.lang.OutOfMemoryError: Java heap space
需要对jmeter的jvm进行调优。记录如下:
1. 问题记录及分析:
使用jmeter执行性能测试,某场景150并发时,出现报错。日志如下:
-
Creating summariser <summary>
-
Created the tree successfully using script/项目.jmx
-
Starting standalone test @ Wed Feb 22 20:36:29 CST 2023 (1677069389986)
-
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4447
-
summary + 1 in 00:00:01 = 0.7/s Avg: 1049 Min: 1049 Max: 1049 Err: 0 (0.00%) Active: 150 Started: 150 Finished: 0
-
java.lang.OutOfMemoryError: Java heap space
-
Dumping heap to java_pid25798.hprof ...
-
Heap dump file created [898948073 bytes in 1.583 secs]
2. 问题分析
利用jmeter在性能测试中模拟并发压测,有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常——内存溢出。
如果内存溢出的话,一般会出现这个提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆内存溢出,不够用了。
内存溢出解决方法:调整堆内存大小。
3. JVM调优
在使用Jmeter做性能测试过程中,可能会因为默认设置的堆内存值较小出现堆内存溢出问题,此时解决的方式有两种,分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法
官方文档地址:https://jmeter.apache.org/usermanual/get-started.html
3.1 官方介绍:
翻译如下:
3.2 创建setenv.bat或setenv.sh文件
setenv.bat、setenv.sh的优先级高于jmeter.bat、jmeter.sh中的jvm参数,会覆盖该文件的jvm参数内容。
Xms、Xmx建议设为物理内存的一半。
注:① setenv.bat、setenv.sh脚本文件语法格式稍有区别。window解析bat文件使用set语法设置变量,linux解析shell语言使用export设置变量。
② 堆的最大值不要超过物理内存的一半,否则容易导致jmeter运行变慢、卡顿甚至内存溢出(因为java本身的垃圾回收机制是动态分配内存,调整时候其本身会占用很多内存)
3.2.1 windows环境
在bin目录创建setenv.bat文件,设置jvm参数
set HEAP=-Xms6G -Xmx6G -XX:MaxMetaspaceSize=256m
3.2.2 Linux环境
在bin目录创建setenv.sh文件,设置jvm参数
export HEAP="-Xms6G -Xmx6G -XX:MaxMetaspaceSize=256m"
4. 展示
在bin目录创建以上文件后,重启jmeter,再次执行压测。
内存溢出问题解决。
PS:当需要模拟的线程数较大时,就需要根据具体情况采用分布式压测的方式了,这种修改堆大小的方法只适用一部分情况,并不是万能的!
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取