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,选项在:
- 在操作之间添加 "think times",即 Constant Timer or Uniform Random Timer
- 更改您的测试场景逻辑以模拟 "requests per second" 而不是 "concurrent users"。您可以使用 Constant Throughput Timer or Throughput Shaping Timer 来完成。
您的问题是由于使用 32 位 OS,在这种模式下,您可以分配为堆的内容受到限制(取决于 OS 您将不能超过 1.6到 2.1 g) 和本机线程创建。
我建议切换到 64 位 OS + 64 位 Jdk。
但如果您没有任何其他选项,请尝试在 JVM_ARGS 中设置 jmeter.sh:
-Xss128k
或者如果太低:
-Xss256k
我的场景,
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,选项在:
- 在操作之间添加 "think times",即 Constant Timer or Uniform Random Timer
- 更改您的测试场景逻辑以模拟 "requests per second" 而不是 "concurrent users"。您可以使用 Constant Throughput Timer or Throughput Shaping Timer 来完成。
您的问题是由于使用 32 位 OS,在这种模式下,您可以分配为堆的内容受到限制(取决于 OS 您将不能超过 1.6到 2.1 g) 和本机线程创建。
我建议切换到 64 位 OS + 64 位 Jdk。
但如果您没有任何其他选项,请尝试在 JVM_ARGS 中设置 jmeter.sh:
-Xss128k
或者如果太低:
-Xss256k