Jenkins java.lang.OutOfMemoryError: GC overhead limit exceeded 詹金斯 java.lang.OutOfMemoryError: GC overhead limit exceeded

3

我目前正在使用Jenkins创建性能框架并从Jenkins执行性能测试。我正在使用https://github.com/jmeter-maven-plugin/jmeter-maven-plugin这个插件。在这个性能框架中,单用户的健全性测试工作正常,并继续进行了200个用户的实际性能测试,在2分钟内收到了以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我尝试了在jenkins.xml中进行以下操作:

<arguments>-Xrs -Xmx2048m -XX:MaxPermSize=512m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --prefix=/jenkins --webroot="%BASE%\war"</arguments>

尝试增加内存,但未成功。同时注意到当增加内存时,Jenkins服务会停止运行,不得不将内存降至1GB,然后服务才能重新启动。

已经尝试增加jmeter和java的内存,但没有帮助。在.jmx文件中禁用了“查看结果树”和其他侦听器,但问题仍然存在。

由于我正在进行POC测试,因此Jenkins托管在我的笔记本电脑上,并具有以下高级规格: 系统型号:Latitude E7270 处理器:Intel(R) Core(TM) i5-6300U CPU @ 2.40GHZ(4CPU's),~2.5GHZ 内存:8192MB RAM

请求帮助。


当将内存(PermSize或堆?)增加到2GB时出现什么错误?另外,运行所有这些的机器规格是什么? - hardillb
编辑问题以添加该信息,并包括更改命令行参数以将内存增加到2GB的信息。 - hardillb
已添加关于命令行参数的信息,它已经在问题中发布。 - Prashanth K
我尝试了这个命令 <arguments>-Xrs -Xmx2048m -XX:MaxPermSize=512m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --prefix=/jenkins --webroot="%BASE%\war"</arguments> 但是Jenkins服务出现了异常,显示错误信息:VM初始化时发生错误,无法为2097152KB对象堆保留足够的空间。由于有8GB的内存可用,不确定为什么甚至2GB都失败了。 - Prashanth K
你正在运行32位的JVM吗?在命令行中添加-d64。 - hardillb
显示剩余3条评论
2个回答

2
关于GC过度开销的错误意味着Jenkins在垃圾回收中出现了问题。这意味着它可能花费更多时间进行垃圾回收而不是执行有用的工作。
当应用程序的堆太小时,通常会出现这种情况。使用现代的多代堆布局,很难确定需要改变什么。
我建议您使用以下选项启用详细GC:“-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps”,然后按照此处的建议操作:http://www.oracle.com/technetwork/articles/javase/gcportal-136937.html

“-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps” 这段代码应该包含在 jenkins.xml 文件中吗? - Prashanth K

0

需要注意的几点:

  1. 您正在使用集成的Maven目标来运行JMeter测试。这将使用Jenkins作为容器来启动您的JMeter测试,从而不仅影响您的工作,还会影响Jenkins的其他用户。
  2. 最好将执行推迟到另一台客户端机器上,例如使用自己的JVM和参数启动测试的专用JMeter机器(或者使用您提供的机器)。

总之, 1. 将测试执行移出Jenkins 2. 将报告输出作为性能插件的输入提供[这也可能会崩溃,因为处理8小时结果文件等耐久性测试结果时需要更多的JVM内存]

这样,您的测试将有更好的扩展机会。此外,您没有提到使用的脚本引擎类型。根据JMeter文档,JSR223与Groovy存在内存泄漏问题。请参考http://jmeter.apache.org/usermanual/component_reference.html#JSR223_Sampler

尝试添加-Dgroovy.use.classvalue=true,看看是否有帮助(前提是您正在使用Groovy)。如果您正在使用Java 8,则很有可能它会为jmeter中的所有脚本创建唯一的类,并增加超出JVM范围的元空间。在这种情况下,请限制元空间并使用类卸载和64位JVM,例如

-d64 -XX:+CMSClassUnloadingEnabled。

另外,您的新生代大小是多少?-XX:NewSize=1024m -XX:MaxNewSize=1024m?请注意,jmeter永久加载所有文件,并直接进入老年代,从而缩小了新生代的任何可用空间。


我没有使用JSR223采样器。关于指定或修改新一代大小,我需要在我安装在笔记本电脑上的JMeter中指定吗?我不太理解将测试执行移出Jenkins并将报告作为插件输入的建议,请您能详细说明这些方面吗? - Prashanth K
当您使用jmeter maven插件时,执行过程将使用jenkins的JVM进程以及jmeter类和所有内容在jenkins中加载。这是一个不适合扩展的模式,因为您正在使用jenkins作为控制器主机来运行测试。您应该添加一个jenkins从机(另一台安装了jmeter的Windows机器),并应该从jenkins主机到从机上运行测试。Jenkins主机可以连接到从机并运行Windows批处理脚本。使用jmeter命令行界面来运行您的测试,并使用CmdRunner来处理结果。 - Selva
是的 - 您在当前模型中进行的所有GC调整都将用于jenkins JVM,因为maven插件运行在jenkins JVM内部。您应该像增加堆大小一样设置jenkins JVM上的新一代。 - Selva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接