【问题标题】:Jenkins java.lang.OutOfMemoryError: GC overhead limit exceededJenkins java.lang.OutOfMemoryError:超出 GC 开销限制
【发布时间】:2017-01-05 16:32:00
【问题描述】:

我目前正在使用 jenkins 创建一个性能框架并执行 Jenkins 的性能测试。我正在使用https://github.com/jmeter-maven-plugin/jmeter-maven-plugin 这个插件。此性能框架中的单用户健全性测试运行良好,并继续进行了 200 个用户的实际性能测试,并在 2 分钟内收到错误 java.lang.OutOfMemoryError:超出 GC 开销限制 我在 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 时会出现什么错误?还有这一切运行的机器的规格是什么?
  • 由于我正在做 POC,jenkins 托管在我的笔记本电脑中,其高级规格如下 系统型号:Latitude E7270 处理器:Intel(R) Core(TM) i5-6300U CPU @ 2.40GHZ( 4CPU),~2.5GHZ 内存:8192MB RAM 当我将内存增加到 2GB(我认为是唯一的堆)时没有错误,只是 jenkins 服务停止
  • 编辑问题以添加该信息并包含有关您更改为将内存增加到 2GB 的 cmd 行 arg 的信息。
  • 添加了有关 cmd 行参数的信息。它已经发布在问题中。
  • 我试过这个 -Xrs -Xmx2048m -XX:MaxPermSize=512m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --prefix=/jenkins --webroot="%BASE%\war" 但是 Jenkins 服务并看到这个异常 在 VM 初始化期间发生错误 无法为 2097152KB 对象堆保留足够的空间 由于 8gb 的 ram 不可用确定为什么连 2GB 都失败了

标签: java jenkins garbage-collection maven-plugin jmeter-maven-plugin


【解决方案1】:

关于 GC 开销的错误意味着 Jenkins 在垃圾收集中崩溃了。这意味着它可能花在垃圾收集上的时间比做有用的工作更多。

这种情况通常发生在堆对于应用程序来说太小时。对于现代多代堆布局,很难说到底需要改变什么。

我建议您使用以下选项“-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps”启用 Verbose GC

然后按照这里的建议:http://www.oracle.com/technetwork/articles/javase/gcportal-136937.html

【讨论】:

  • "-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" 这应该包含在 jenkins.xml 中吗?
【解决方案2】:

注意事项

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

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

这样,您的测试将有更好的扩展机会。此外,您还没有提到您使用的是什么类型的脚本引擎。根据 Jmeter 文档,带有 groovy 的 JSR223 存在内存泄漏。请参考 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 中指定吗?而且我不太了解将测试执行移出詹金斯并将报告作为插件输入的建议?能否请您详细说明这些方面?
  • 当你使用 jmeter maven 插件时,执行使用 jenkins JVM 进程和 jmeter 类,一切都在 jenkins 中加载。这是一个不好扩展的模型,因为您使用 jenkins 作为控制器主机来运行测试。您应该添加一个 jenkins 从属设备(另一台安装了 jmeter 的 windows 机器),并且应该从 jenkins master 运行测试到从属设备。 Jenkins master 可以连接到 slave 并运行 windows 批处理脚本。使用 jmeter 命令行界面运行您的测试并使用 CmdRunner 处理您的结果。
  • 是的 - 您在当前模型中所做的所有 GC 调整都将针对 jenkins JVM,因为 maven 插件在 jenkins JVM 中运行。您应该像增加堆大小一样在 jenkins JVM 上设置新一代
猜你喜欢
  • 2017-12-27
  • 2020-09-08
  • 2020-07-24
  • 2019-06-29
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多