【问题标题】:Uncaught Exception java.lang.OutOfMemoryError: "unable to create new native thread" error occurring while running jmeter in non gui mode未捕获的异常 java.lang.OutOfMemoryError:在非 gui 模式下运行 jmeter 时发生“无法创建新的本机线程”错误
【发布时间】:2017-02-16 03:37:41
【问题描述】:

我的场景,

Step1:我已将线程组设置为 1000:threads & 500:seconds
Step2:配置 heep 空间:HEAP=-Xms1024m -Xmx1024m
Step3:现在,为非 gui 模式运行 jmeter。 在这种情况下,“Uncaught Exception java.lang.OutOfMemoryError:无法创建新的本机线程”错误发生在我的系统中。

我的系统配置

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

请给我这个场景的解决方案。

谢谢, 瓦拉穆图。

【问题讨论】:

  • 1k 线程将消耗大量内存(我相信每个线程堆栈 4M 或 8M 取决于操作系统),您没有足够的 RAM。

标签: jmeter jmeter-plugins


【解决方案1】:

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

您必须考虑以下几点:

  • JMeter 是一个与 JVM 一起运行的 Java 工具。为了获得最大能力,我们需要在执行过程中为JMeter提供最大的资源。首先,我们需要增加堆大小(在JMeter bin目录中,我们得到jmeter.bat/ sh)

    HEAP=-Xms512m –Xmx512m

这意味着默认分配的堆大小是最小512MB,最大512MB。根据您自己的 PC 配置进行配置。请记住,操作系统也需要一定数量的内存,因此不要分配所有物理 RAM

  • 然后,添加内存分配率

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

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

  • JMeter 是 Java GUI 应用程序。它也有非 GUI 版本,非常占用资源(CPU/RAM)。如果我们在非GUI模式运行Jmeter,它会消耗更少的资源,我们可以运行更多的线程。

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

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

  • 始终尝试使用最新软件。让您的 Java 和 JMeter 保持更新。

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

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

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

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

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

我还发现article 对理解和处理它们很有帮助。

【讨论】:

    【解决方案2】:

    错误是由于缺少可用 RAM。

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

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

    • 应将应用程序响应时间添加到思考时间

    因此,假设您有 1000 个用户,每个用户“认为”操作之间的时间为 10 秒,应用程序响应时间为 2 秒,每个用户每分钟将能够发送 5 个请求 (60 / (10 + 2))。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      -Xss128k

      或者如果太低:

      -Xss256k

      【讨论】:

      • 您好,我只想问一下这个怎么设置?我要这样设置吗? JVM_ARGS="-Xms1024m -Xmx1024m -Xss256k"。但这不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多