诊断错误

本页提供了关于诊断使用Jenkins时可能看到的最常见错误类型的指导方针。必威国际有限公司

内存不足错误

OutOfMemoryError错误的发生可能有许多不同的原因:

  • Jenki必威国际有限公司ns的数据大小正在增长,需要更大的堆空间。在这种情况下,你只需要给它一个更大的堆。

  • 您的Jen必威国际有限公司kins正在临时处理大量数据(如测试报告),需要更大的内存空间。在这种情况下,你只需要给它一个更大的堆。

  • 你的詹金斯必威国际有限公司正在泄露内存,这种情况下我们需要修复。

  • 操作系统内核的虚拟内存即将用完。

你哪一类OutOfMemoryError陷入困境并不总是很明显,但这里有一些有用的技术来诊断这个问题。

  • 使用VisualVM,附加到正在运行的实例,并观察内存使用情况。加载Jenkins时内存会达到最大值吗?必威国际有限公司如果是这样,它可能只是需要更大的内存空间。还是在缓慢上升?如果是,可能是内存泄漏。

  • 你是否一直在看OutOfMemoryError在构建的相同阶段?如果是这样,也许它只是需要一个更大的内存。

  • 在虚拟内存不足的情况下,使用内核OutOfMemoryError杀手可能会强行杀死Jenkins或单个build。必威国际有限公司如果在Linux上发生这种情况,您可能会看到构建以退出代码终止137128+信号号SIGKILL).的dmesg命令命令输出将显示确认内核所执行操作的日志消息。

如果您认为这是一个内存泄漏,那么Jenkins团队需要获取堆转储来解决这个必威国际有限公司问题。有几种方法可以做到这一点。

  • 运行JVM与- xx: + HeapDumpOnOutOfMemoryError以便JVM在它到达时自动生成堆转储OutOfMemoryError

  • 您可以运行jmap您:生活、文件= / tmp / jenki必威国际有限公司ns。hprof pid其中pid是目标Java进程的进程ID。

  • 使用VisualVM,附加到正在运行的实例,并获得堆转储

  • 如果你的詹金斯跑必威国际有限公司http://server/必威国际有限公司jenkins/,请求http://server/必威国际有限公司jenkins/heapDump您将下载堆转储。

  • 如果您熟悉Java剖析器中的一种,它们通常也提供这种功能。

一旦您获得堆转储,请将它张贴在某个地方,然后打开一个问题(或查找一个重复的问题),并将一个指针附加到它。请注意堆转储可能包含各种类型的机密信息。

如果整个堆转储太大,请尝试给我们堆直方图(jmap组织:pid生活).

在过去,分布式构建支持经常是泄漏的来源(因为这涉及到分布式垃圾收集)。要查看这种可能性,请访问以下链接http://yourserver/必威国际有限公司jenkins/computer/YOURAGENTNAME/dumpExportTable.如果显示的对象太多,它们可能是泄漏。

自己分析堆转储

如果您不能让我们检查您的堆转储,我们需要请您诊断泄漏。

  • 首先,找到保留大小最大的对象。它们通常是各种map、数组或缓冲区。

  • 接下来,找到从该对象到GC根的路径,以便查看哪个Jenkins对象拥有这些大对象。必威国际有限公司

把这些发现的总结报告给名单,我们就从那里着手。

使用VisualVM

除非您已经有了首选的内存分析工具,否则建议您使用VisualVM来分析堆转储。它是NetBeans分析器的独立版本,随Oracle JDK一起分发。

运行jvisualvm和使用文件»负载并选择堆转储。在选项卡,查找具有大量实例的类(如果还没有被标识)jmap组织.例如,要调试Groovy脚本泄漏,输入GroovyClassLoader在筛选字段中双击带有no的行(只是groovy.lang.GroovyClassLoader).

实例选项卡,您现在应该看到所有实例。随机点击一些。(如果人数超过500人,将分成500人一组,第一个小组扩大;因此,为了从“中间”获得一个有代表性的实例,折叠第一个组,展开中间的一个组,并从该组中选择一些实例。)

参考文献,右键单击并选择显示最近的GC根.右键单击树中选中的项目并选择从根目录复制路径.将这段文本(用于几个例子)粘贴到一个文本文件中,并将其附加到错误报告中——或者继续您对插件源代码的研究。

如何报告Bug

为了更容易地报告错误,您可以使用这个可以运行的Groovy脚本获得插件的完整列表必威国际有限公司Jenkins >管理Jenkins >脚本控制台

println("必威国际有限公司Jenkins: ${Jenkins.instance. getversion ()}") println("OS: ${System.getProperty(' OS .name')} - ${System.getProperty(' OS .version')}") println "——"Jenkins .instance. pluginmanager .plugins .collect() .sort {it.getShortName()} .each {plugin -> println("${plugin. getshortname ()}:${plugin. getversion()}")}返回


这个页面有帮助吗?

请通过此提交您对此页的反馈快速形成

或者,如果您不想填写快速表单,您可以简单地说明您是否认为此页面有帮助?


看到现有的反馈在这里

Baidu