JMeter压测时报“内存不足”故障的9个简单解决方案
Test failed! java.lang.OutOfMemoryError: Java heap space
测试失败了!java.lang.OutOfMemoryError:Java堆空间

在不更改当前硬件设置的情况下获得JMeter测试的最大负载
1.增加Java堆大小
Java堆空间(在错误消息中引用)是JVM从底层操作系统获取的内存,
用于为创建必要对象分配空间。
JMeter的默认配置(请参阅适用于Windows的jmeter.bat或适用于非Windows系统脚本的jmeter)假定堆空间仅为512 MB。
这实际上相当低!
如果您的测试运行超过512Mb的大型对象,
您将收到OOM错误,
并且您的测试将失败。
只需将最大堆大小增加到总可用物理RAM的约80%。
为此,
请在JMeter启动脚本中找到以下行:
HEAP =“ - Xms512m -Xmx512m”
现在相应地更改-Xmx值。
例如:
如果要将最大堆大小设置为4千兆字节,
则需要将行更改为:HEAP =“ - Xms512m -Xmx4096m”
要应用更改,
您需要重新启动JMeter。
2.使用最新软件
如果您的软件已过期,
确保您使用的是以下最新版本:
- Java - 尽可能使用最新的64位版本的Java SE JDK或Server JRE
- JMeter - 最好使用最新版本的JMeter,因为除了任何新功能外,新版本还包含性能改进和错误修复。
- JMeter插件(或其他第三方库) - 原因与Java和JMeter相同
3.在非GUI模式下运行测试
切勿在JMeter GUI上运行负载测试!
仅用于测试记录,开发和调试。
JMeter根本不是为了在GUI模式下产生高负载而设计的,
这意味着它不仅会冻结 - 而且还会消耗大量资源并产生不可靠的负载测试结果。
我建议在命令行模式,
Ant任务或Maven插件中运行负载测试 - 但从不使用GUI。
4.明智地使用监听器
在负载测试期间应禁用监听器。
启用它们会导致额外的开销,
这会占用测试中更重要元素所需的宝贵资源。
您可以在测试完成后使用所需的任何侦听器打开.jtl结果文件并执行其分析。
5.确定您需要存储哪些指标
配置JMeter以确保它只保存您绝对需要的指标。
您可以通过向user.properties文件添加相关行来控制要存储的内容(您可以在JMeter安装的/ bin文件夹中找到它)。

例如:
使用Active Threads Over Time Listener或Response Times vs Threads等监听器,
您需要存储当前活动线程的数量(默认情况下不会这样做)。
要启用此功能,
您需要将“jmeter.save.saveservice.thread_counts = true”行添加到user.properties文件中。
同样,
要控制结果的保存方式,
请搜索jmeter.properties文件的Results File Configuration部分(您也可以在JMeter / bin文件夹中找到它)并检查名称开头的属性的名称和默认值用:“jmeter.save.saveservice”。
找出适当的配置后,
您可以通过指定需要存储哪些指标以及不需要哪些指标来修改user.properties文件。
不要忘记,
在存储请求和响应头时,
断言结果和响应数据会占用大量内存!
因此,
除非绝对必要,
否则尽量不要将这些值存储在JMeter上。
6.选择“正确关联选项”
如果需要从先前的响应中提取某些内容,
请尝试使用正则表达式提取器。
如果由于某种原因不可能(即您需要使用多行复杂正则表达式从HTML获取多个值),
请尝试以下方法之一:
如果页面有一个非常复杂的DOM,但样式的数量相对较少 - 请转到CSS / JQuery Extractor
如果样式数量很高且DOM非常简单 - 请使用XPath Extractor
如果你有足够的时间,
你可以为每个PostProcessor进行实验并获取内存占用量。
这将清楚地显示哪一个更好。
但请记住 - 由于不同的应用程序具有不同的响应,因此必须将此方法应用于每个页面。
7.谨慎使用断言
添加到测试计划中的每个测试元素都将被处理 - 这需要CPU时间和内存。
这也适用于所有断言,
对于比较断言尤其如此- 它消耗大量资源和内存。
只使用你需要的断言,
即使这样,
只需使用绝对需要的数量。
8.检查您的脚本语言
JMeter支持相当多的脚本语言。
但是,
如果您使用基于脚本的采样器来创建实际负载,
则需要使用JSR223采样器和“Groovy”作为语言。
9.“调整”你的JVM
您还可以在JMeter启动脚本中添加或修改以下JVM参数:
在JMeter启动脚本中找到NEW =“ - XX:NewSize = 128m -XX:MaxNewSize = 128m”行。取消注释并增加值以匹配您为HEAP设置的值
-server - 通过运行时参数优化将JVM切换到“服务器”模式。在这种模式下,JMeter启动速度更慢,但总体吞吐量会更高
-d64 - 如果您有64位操作系统,请使用此参数明确告诉JVM以64位模式运行
-XX:+ UseConcMarkSweepGC - 这会强制使用CMS垃圾收集器。它将降低整体吞吐量,但会导致更短的CPU密集型垃圾收集。
-XX:+ DisableExplicitGC - 这可以防止应用程序强制进行昂贵的垃圾收集,并有助于避免意外暂停。如果您认为JMeter的吞吐量可能更好并且它没有充分利用JVM,操作系统和机器资源,请尝试使用JConsole或VisualVM来监视JMeter进程并检查堆大小使用情况,GC间隔,系统在垃圾中花费的时间收集等。理想情况下,GC应该看起来像健康人的“脉搏”。垃圾收集器应该经常射击以防止OOM - 但不是太多,以至于强烈感受到它的影响。
JMeter压测时报“内存不足”故障的9个简单解决方案的更多相关文章
- dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
- jmeter --- 压测时,如何让串联压测多个接口
1.新建测试计划,在测试计划里勾选“独立运行每个线程组” 2.分别在每个线程组,添加聚合报告,以得到每个线程组的压测结果 3.设置不同接口压测的vu等,并为每个线程组,设置合理的启动延迟时间
- 在linux上用jmeter压测时出现很多异常java.net.NoRouteToHostException: Cannot assign requested address.
今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 经网上查资料, 是由 ...
- jmeter压测前清理内存
jmeter 压测时设置了内存为sed -i 's/HEAP="-Xms512m -Xmx512m"/HEAP="-Xms36096m -Xmx360096m" ...
- Jmeter压测报错:Non HTTP response code: java.net.ConnectExceptionexception的解决办法
前一段时间进行jmeter压测时,一直报错,查看了下日志才发现报了一堆Non HTTP response code: java.net.ConnectExceptionexception,直接jmet ...
- Jmeter报内存溢出解决方案
描述:wimdows环境,做上传图片接口测试,涉及图片合成和上传,图片采用base64编码.每1s启动200线程的时候,Jmeter报内存溢出错误. 解决方案: 1.修改jmeter.bat: set ...
- jmeter压测学习12-设置持续压测时间(调度器的使用)
前言 使用jmeter 做压测的时候,希望对一个接口持续压测 10 分钟或者半小时,可以使用调度器设置持续压测时间. 设置样本总数 压测方式有2种,一种是设置线程组和循环次数,这样可以设置一个样本总数 ...
- wrk,ab,locust,Jmeter 压测结果比较
背景: 项目需要对一批接口进行压测,要求是接口的QPS(Quest Per Second每秒请求数)达到6万以上由于楼主一直使用的压力测试工具是jmeter,但是jmeter单台电脑无法达到6万的QP ...
- windows下Jmeter压测端口占用问题(亲测有效)
windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...
随机推荐
- NET高级开发工程师职责要求
岗位职责1.参与架构以及核心业务的设计:2.使用简单,干净,可维护性高,扩展性好的代码实现产品功能,并在必要时重构现有代码:3.贯彻面向接口以及模块化组件的设计理念:4.熟练RabbitMQ.ES.M ...
- java学习摘抄笔记mybaits2
mybatis第二天 高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...
- PHP防止刷微信红包方法
PHP防止刷微信红包方法1 输入验证码2授权登陆后 领取红包记录下 openid ip 第二次用openid或者ip(ip)连接同一个路由器是一样的 所以用ip 判断最好是判断有没有6个以上 判断有没 ...
- LeNet-5 卷积神经网络结构图
LeNet-5是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一.可以说,Le ...
- 在linux上安装redis
下载Redis安装包 wget http://download.redis.io/releases/redis-3.2.9.tar.gz 解压Redis安装包 tar -zxvf redis-3.2 ...
- 长乐国庆集训Day5-2
T1 彩虹 题目 [题目描述] Mr.Raju和他的一个大家庭外出度假,他们想要乘着彩虹欣赏周围的景色,但是这样最会有一些问题. 在他们家族中,如果一个人想要骑上彩虹,那么他喜欢的所有人和喜欢他的所有 ...
- Linux系统 关机/重启/用户切换/注销,用户管理(用户创建/修改,用户组增加/删除),Linux中 / 和 ~ 的区别
1.关机/重启命令 shutdown命令 shutdown -h now :立即关机 shutdown -h 1 :1分钟后关机 shutdown -r now :立即重启 shutdown -r 1 ...
- Go基础编程实践(五)—— 错误和日志
自定义错误类型 Go中可以使用errors.New()创建错误信息,也可以通过创建自定义错误类型来满足需求.error是一个接口类型,所有实现该接口的类型都可以当作一个错误类型. // error类型 ...
- cas sso 单点登录
一些介绍: https://www.jianshu.com/p/b7de8e4cf217 https://blog.csdn.net/javaloveiphone/article/details/52 ...
- python3的pip3安装
---恢复内容开始--- pip3的安装需要对应一整套python的编译工具库,所以安装好的pip3是这个样子: inear@Ai:~$ pip3 -V pip 18.1 from /usr/lib/ ...