zoukankan      html  css  js  c++  java
  • JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法(实测有效)

    一、问题原因

    用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。

    原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。

    概念补充:

    内存泄露:应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源。

    内存溢出:应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃。

    通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。

    对JMeter而言也是如此,JMeter测试过程中,如果内存溢出的话,一般会出现上图中的提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆内存溢出,不够用了

    二、解决方法

    知道了报错出现的原因是因为堆内存大小不足引起的,自然而然就会想到内存溢出的解决方法:调整堆内存大小。

    步骤(以Windows系统为例,Linux系统类似):

    1、打开jmeter.bat文件,按关键字“HEAP”搜索,把原来的配置改为如下:

    修改前:

    if not defined HEAP (

    rem See the unix startup file for the rationale of the following parameters,

    rem including some tuning recommendations

    set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m

    )

    修改后:

    if not defined HEAP (

    rem See the unix startup file for the rationale of the following parameters,

    rem including some tuning recommendations

    set HEAP=-Xms512m -Xmx4000m

    set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m

    )

    set HEAP=-Xms512m -Xmx4000m调整堆内存的大小
    set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m调整堆内存中新生带的大小

    注意:

    这个值不是越大越好,要根据压测使用的机器而定,一般而言,堆内存的最大值不要超过物理内存的一半,否则容易导致jmeter运行变慢、

    卡顿甚至内存溢出(因为java本身的垃圾回收机制是动态分配内存,调整的时候其本身会占用很多内存),NEW分配的内存,不宜太大。

    2、修改完成后保存,重启JMeter,即可生效。

    三、小结

    1、这种修改堆大小的方法只适用一部分情况,并不是万能的,当需要模拟的线程数较大时,就需要根据具体情况采用分布式压测的方式了。

    2、命令行运行JMeter时,一定要禁用“查看结果树”、“聚合报告”等监听器,因为真的真的真的很消耗内存。

  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/fppblog/p/13278966.html
Copyright © 2011-2022 走看看