首页 > 解决方案 > Jenkins 抛出 java.lang.StackOverflowError -- 不只是在 unstash 上

问题描述

更新 2019 年 7 月 31 日
该错误有时会在 unstash 调用之前发生,但总是在同一台服务器上。为了查看问题是否是由于 unstash 在需要覆盖文件的目录中工作引起的,我清理了该目录——但问题仍然存在。这次输出开始了(转录,任何错别字都是我的错):

Running on my_agent in C:/Jenkins/workspace/script_name
. . .
Running in D:\mydir
[Pipeline] {
[Pipeline] bat
[mydir] Running batch script
D:\mydir> dir .
<output of dir command>
[Pipeline] End of Pipeline
java.lang.StackOverflowError
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:115)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:778)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
etc.

它没有到达 unstash 调用,但仍然出现相同的错误。
= = = = =
在 Windows 10 上的 Jenkins 中卸载时出现 java.lang.StackOverflowError;发生在一台服务器上,但不在另一台服务器上。看起来 unstash 正在无限递归。

def stash_my_stuff() {
    stash includes: '**', name: 'my_stash'
}
def unstash_my_stuff() {
    unstash 'my_stash'
}

// on one agent
dir("d:\\tmsc") { unstash_my_stuff() }

// later on a different agent
dir("d:\\tmsc") { unstash_my_stuff() }
13:23:33 Running in D:\tmsc
[Pipeline] {
[Pipeline] unstash
[Pipeline] }
[Pipeline] // dir
[Pipeline] dir
13:24:01 Running in D:\tmsc
[Pipeline] {
[Pipeline] End of Pipeline
java.lang.StackOverflowError
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:111)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:778)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
etc., etc., etc.
sometimes it also includes
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:967)

标签: jenkinsjenkins-pipelinestack-overflow

解决方案


我遇到了类似的错误,并最终通过几件事解决了它,其中之一是 MarekR 在他的回答中提到的。

  1. 更新 jenkins.xml 文件以使用 64 位 JRE
  2. 将 JRE 的最大堆大小增加到 1024m(在 jenkins.xml 文件中)
  3. 在 jenkins.xml 中也将堆栈大小增加到 4m (-Xss4m)

最后一定要保存 xml 文件并重新启动 jenkins 服务以获取新的更改。

希望这可以帮助!


推荐阅读