zoukankan      html  css  js  c++  java
  • JMeter压测时报“内存不足”故障的9个简单解决方案

    Test failed! java.lang.OutOfMemoryError: Java heap space 

    测试失败了!java.lang.OutOfMemoryError:Java堆空间

    JMeter  - 内存不足失败

    在不更改当前硬件设置的情况下获得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.使用最新软件

    如果您的软件已过期,

    确保您使用的是以下最新版本:

    1. Java - 尽可能使用最新的64位版本的Java SE JDK或Server JRE
    2. JMeter - 最好使用最新版本的JMeter,因为除了任何新功能外,新版本还包含性能改进和错误修复。  
    3. JMeter插件(或其他第三方库) - 原因与Java和JMeter相同

    3.在非GUI模式下运行测试

    切勿在JMeter GUI上运行负载测试!

    仅用于测试记录,开发和调试。

    JMeter根本不是为了在GUI模式下产生高负载而设计的,

    这意味着它不仅会冻结 - 而且还会消耗大量资源并产生不可靠的负载测试结果。

    我建议在命令行模式,

    Ant任务或Maven插件中运行负载测试 - 但从不使用GUI。

    4.明智地使用监听器

    在负载测试期间应禁用监听器。

    启用它们会导致额外的开销,

    这会占用测试中更重要元素所需的宝贵资源。

    您可以在测试完成后使用所需的任何侦听器打开.jtl结果文件并执行其分析。

      

    5.确定您需要存储哪些指标

    配置JMeter以确保它只保存您绝对需要的指标。

    您可以通过向user.properties文件添加相关行来控制要存储的内容(您可以在JMeter安装的/ bin文件夹中找到它)。 

    JMeter指标

    例如:

    使用Active Threads Over Time ListenerResponse 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获取多个值),

    请尝试以下方法之一:

    1. 如果页面有一个非常复杂的DOM,但样式的数量相对较少 - 请转到CSS / JQuery Extractor

    2. 如果样式数量很高且DOM非常简单 - 请使用XPath Extractor

    如果你有足够的时间,

    你可以为每个PostProcessor进行实验并获取内存占用量。

    这将清楚地显示哪一个更好。

    但请记住 - 由于不同的应用程序具有不同的响应,因此必须将此方法应用于每个页面。  

    7.谨慎使用断言

    添加到测试计划中的每个测试元素都将被处理 - 这需要CPU时间和内存。

    这也适用于所有断言

    对于比较断言尤其如此- 它消耗大量资源和内存。

    只使用你需要的断言,

    即使这样,

    只需使用绝对需要的数量。

    8.检查您的脚本语言

    JMeter支持相当多的脚本语言。

    但是,

    如果您使用基于脚本的采样器来创建实际负载,

    则需要使用JSR223采样器和“Groovy”作为语言。

     

    9.“调整”你的JVM 

    您还可以在JMeter启动脚本中添加或修改以下JVM参数:

      1. 在JMeter启动脚本中找到NEW =“ - XX:NewSize = 128m -XX:MaxNewSize = 128m”行。取消注释并增加值以匹配您为HEAP设置的值

      2. -server - 通过运行时参数优化将JVM切换到“服务器”模式。在这种模式下,JMeter启动速度更慢,但总体吞吐量会更高

      3. -d64 - 如果您有64位操作系统,请使用此参数明确告诉JVM以64位模式运行

      4. -XX:+ UseConcMarkSweepGC - 这会强制使用CMS垃圾收集器。它将降低整体吞吐量,但会导致更短的CPU密集型垃圾收集。

      5. -XX:+ DisableExplicitGC - 这可以防止应用程序强制进行昂贵的垃圾收集,并有助于避免意外暂停。如果您认为JMeter的吞吐量可能更好并且它没有充分利用JVM,操作系统和机器资源,请尝试使用JConsoleVisualVM来监视JMeter进程并检查堆大小使用情况,GC间隔,系统在垃圾中花费的时间收集等。理想情况下,GC应该看起来像健康人的“脉搏”。垃圾收集器应该经常射击以防止OOM - 但不是太多,以至于强烈感受到它的影响。

  • 相关阅读:
    for循环的执行循序
    final和finally面试时最好的回答
    关于java类加载器的一些概念
    JVM内存分析
    建造者模式
    外观模式
    常用的设计模式
    Java基础知识:Java实现Map集合二级联动3
    Java基础知识:Java实现Map集合二级联动1
    MySQL数据库怎么截取字符串?
  • 原文地址:https://www.cnblogs.com/yjlch1016/p/11257486.html
Copyright © 2011-2022 走看看