Uncaught Exception java.lang.OutOfMemoryError: "unable to create new native thread" error occurring while running jmeter in non gui mode

Uncaught Exception java.lang.OutOfMemoryError: "unable to create new native thread" error occurring while running jmeter in non gui mode

我的场景,

Step1:我已经为 1000:threads & 500:seconds
设置了我的线程组 Step2:配置堆space : HEAP=-Xms1024m -Xmx1024m
Step3:现在,运行 jmeter 用于非 gui 模式。 在这种情况下,"Uncaught Exception java.lang.OutOfMemoryError: unable to create new native thread" 我的系统出现错误。

我的系统配置

处理器:Intel® Pentium(R) CPU G2010 @ 2.80GHz × 2
OS类型:32位
光盘:252.6GB
内存:3.4 GiB

请给我一个解决方案。

谢谢, Vairamuthu.

您的计算机没有足够的内存 来消耗1000 个线程。从错误中可以清楚地看到你的机器无法创建 1000 个线程。你应该调整你的机器来解决这个问题。

你必须考虑这几点:

  • JMeter 是一个 Java 工具,它 运行 与 JVM 相结合。要获得最大容量,我们需要在execution.First期间向JMeter提供最大资源,我们需要增加堆大小(JMeter bin内部目录,我们得到 jmeter.bat/sh)

    HEAP=-Xms512m –Xmx512m

表示默认分配的堆大小为最小512MB,最大512MB。根据您自己的 PC 配置对其进行配置。请记住,OS 还需要一些内存,因此 不要分配所有物理 RAM

  • 然后,加上内存分配率

    NEW=-XX:NewSize=128m -XX:MaxNewSize=512m

这意味着内存将以此速度增加。你应该小心,因为,如果你的 负载生成在开始时非常高 ,这可能需要增加。请记住,如果范围太宽,它会在 JVM 内对您的堆 space 进行分段。如果是这样,垃圾收集器 需要更加努力地清理。

  • JMeter 是 JavaGUI 应用程序。它还具有非常耗费资源的 non-GUI 版本 (CPU/RAM)。如果我们 运行 Jmeter 处于 non-GUI 模式 ,它将消耗更少的资源,我们可以 运行 更多线程。

  • 在测试期间禁用所有监听器 运行。它们仅用于调试并使用它们来设计您想要的脚本。

监听器 应在负载测试期间被禁用。启用它们会导致额外开销,这会消耗您的测试中更重要的元素所需的宝贵资源(更多内存)。

  • 始终尝试使用 Up-to-date 软件。保持你的 Java 和 JMeter 更新。

  • 不要忘记,在存储请求和响应时 headers,断言结果和响应数据会消耗 大量内存 !所以尽量不要将这些值存储在 JMeter 上除非绝对必要

此外,您需要监控您的机器是否 Memory consumption, CPU usages 运行宁 低于 80% 与否。如果这些使用率超过 80%,则认为这些测试与报告一样不可靠。

在所有这些之后,如果您不能从您的机器生成 1000 个线程,那么您必须尝试 Distributed Load Testing

这是 JMeter Distributed Testing Step-by-step 的文档。

为了更好、更详细地理解这两个博客 How many users JMeter can support? and 9 Easy Solutions for a JMeter Load Test “Out of Memory” Failure 必须有所帮助。

我还发现这个 article 对理解和处理它们非常有帮助。

错误是由于缺少空闲 RAM。

查看您的硬件,您似乎无法产生 1k 用户的负载,因此我建议您重新考虑您的方法。

例如,您预计有 1000 个用户同时使用您的应用程序。然而,这并不一定意味着 100 个 并发 用户:

  • 真正的用户不会不停地锤应用,他们需要一些时间来"think"在操作之间,这个"think time"因应用性质而异,但你应该尽可能接近现实尽可能
  • 应将应用程序响应时间添加到思考时间

假设您有 1000 个用户,每个用户 "thinks" 操作之间的间隔为 10 秒,应用程序响应时间为 2 秒,每个用户每分钟可以发送 5 个请求 (60 / (10 + 2 )).

假设上述情况 1000 个用户每分钟发送 5000 个请求,这给我们每秒 ~83 个请求,这似乎可以通过您当前的硬件实现。

因此,如果您无法获得更强大的硬件或更多类似的机器来使用 JMeter in distributed more,选项在:

您的问题是由于使用 32 位 OS,在这种模式下,您可以分配为堆的内容受到限制(取决于 OS 您将不能超过 1.6到 2.1 g) 和本机线程创建。

我建议切换到 64 位 OS + 64 位 Jdk。

但如果您没有任何其他选项,请尝试在 JVM_ARGS 中设置 jmeter.sh:

-Xss128k

或者如果太低:

-Xss256k