java - Jmeter java.lang.OutOfMemoryError : GC overhead limit exceeded 错误

标签 java amazon-ec2 garbage-collection jvm jmeter

我正在使用 Jmeter 将工作负载注入(inject)部署在 AWS EC2 实例上的应用程序。测试必须非常庞大:它持续 10 个小时,工作负载配置文件具有双峰形状,5 分钟内大约有 2600 个请求。实际上我有一个部署了应用程序的 m3.xlarge 实例和 8 个 m3.xlarge 实例,每个实例都运行一个 jmeter 实例。使用 python 脚本,要注入(inject)的工作负载被分配到 8 个客户端实例中,因此在示例中,如果原始工作负载注入(inject) 800 个请求,则每个 jmeter 实例将注入(inject) 100 个请求。正如我所说,完整测试持续 10 小时,并分为每个 5 分钟的时间步长。每 5 分钟应用一点工作量变化。实际上,我从每个 jmeter 实例中得到 java.lang.OutOfMemoryError: GC overhead limit exceeded 错误,在测试开始后立即出现并且没有请求到达应用程序。我在网上和 stackoverflow 上看了很多,我得出结论,可能的错误可能是:

  • JMV 堆大小太小-> 我解决了在每个 jmeter 实例的 jmeter.bat 文件中设置以下内容:

    设置堆=-Xms4g -Xmx4g

    设置 NEW=-XX:NewSize=4g -XX:MaxNewSize=4g

  • 代码中的一些错误导致垃圾收集器继续无用地使用。所以我从我的测试中删除了所有的 jmeter 监听器。特别是我使用了 TableVisualizer、ViewResultsFullVisualizer、StatVisualizer 和 GraphVisualizer。

无论如何,问题仍然存在。我真的不知道如何解决它。我知道 10 小时的 2600 音调请求测试可能是一项非常繁重的测试,但我认为应该有一种方法可以执行此操作。我正在使用 EC2 m3.xlarge 实例,因此如果有用的话,我什至可以将堆大小提高到 8G,或者将工作负载分配给更多的客户端,因为我使用的是 spot 实例,所以我不会支付更多费用,但是因为我已经将客户端实例的数量从 4 个增加到 8 个来解决问题并且不起作用我有点困惑,我想在继续获得越来越多的资源之前了解一些建议。 非常感谢您。

最佳答案

您的堆设置看起来不对: 设置 HEAP=-Xms4g -Xmx4g 设置 NEW=-XX:NewSize=4g -XX:MaxNewSize=4g

你的 new 等于 Heap size,这是错误的。首先评论新部分。

你能做一个 ps -eaf|grep java 并显示输出吗?

并确保您遵守这些建议:

最后,展示您的测试计划概览以及您启动的线程数。

关于java - Jmeter java.lang.OutOfMemoryError : GC overhead limit exceeded 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694480/

相关文章:

r - fread() 运行时间比报告的速度要长

tomcat - 我一直在尝试连接到我的 Ubuntu-Ec2 实例上的 tomcat webapp 管理器。即 "myinstanceIP:8080"但这种情况发生了

memory-management - 垃圾收集器收集堆栈内存、堆内存还是两者兼而有之?

C# GC 的使用以及如何跟踪内存泄漏

java - Android - Activity 堆栈,将当前 Activity 置于最前面并禁用后退键

java - JFreeChart Java - 如何创建它是一个循环中的很多系列

amazon-web-services - 无法连接到 AWS E2 实例(但安全组允许入站)

java - 使用 Java 从字符串中提取标记

java - 为两个应用程序构建通用接口(interface)(一个在 .asp 中,另一个在 java 中)

java - 复合对象中的父子关系?