JMeter:内存溢出解决办法

2476 篇文章 2 订阅
2313 篇文章 14 订阅

使用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:当需要模拟的线程数较大时,就需要根据具体情况采用分布式压测的方式了,这种修改堆大小的方法只适用一部分情况,并不是万能的!

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

图片

整套资料获取

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache JMeter 是一个广泛使用的开源性能测试工具,用于评估软件系统的性能和负载。然而,像所有其他工具一样,如果使用不当或面临高负载,JMeter可能会遇到内存溢出的问题。内存溢出通常发生在以下几个方面: 1. **循环和并发用户数设置过高**:当测试计划中包含大量的用户并发执行,且循环次数过多时,如果没有适当地调整线程池大小,就可能导致内存需求超过可用内存。 2. **大尺寸的数据集**:在使用数据驱动或者包含大数据量的脚本时,如果没有优化数据源或处理方式,JMeter可能会一次性加载大量数据到内存,从而引发内存溢出。 3. **未释放的资源**:如果在测试过程中有资源没有被正确地关闭或者清理(例如,HTTP响应缓存、文件句柄等),这些资源会占用内存,时间久了就会导致内存消耗过大。 4. **长时间运行**:长时间运行的测试可能使JMeter的内存逐渐积累,特别是如果测试没有定期清除已结束线程的数据。 要解决JMeter内存溢出问题,你可以尝试以下方法: - **优化测试计划**:减少循环次数,合理配置线程池大小。 - **分批执行**:将大请求拆分成小的请求,避免一次性加载过多数据。 - **监控内存使用**:使用内置的监视器或者第三方工具来实时查看内存使用情况。 - **及时释放资源**:确保每次请求完成后资源都被正确释放。 - **使用断言和监听器**:限制不必要的数据存储,比如限制查看结果的数量。 - **使用内存限制策略**:某些版本的JMeter支持设置内存使用上限,防止内存无限制增长。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值