Dojo 1.7构建: 内存不足错误

4

在升级到Dojo 1.7.3后,我们之前版本的Dojo上运行良好的ant构建现在完全无法操作,因为出现了内存溢出错误:

[java] starting writing resources...
[java] java.lang.OutOfMemoryError: GC overhead limit exceeded
[java]     at org.mozilla.javascript.Interpreter.getArgsArray(Interpreter.java:4623)
[java]     at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:3335)
[java]     at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:2484)
[java]     at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:162)
[java]     at org.mozilla.javascript.NativeArray.iterativeMethod(NativeArray.java:1565)
[java]     at org.mozilla.javascript.NativeArray.execIdCall(NativeArray.java:313)
[java]     at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
[java]     at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:3335)
[java]     at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:2484)
[java]     at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:162)
[java]     at org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2347)
[java]     at org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:272)
[java]     at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
[java]     at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
[java]     at org.mozilla.javascript.gen.c1._c62(Unknown Source)
[java]     at org.mozilla.javascript.gen.c1.call(Unknown Source)
[java]     at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
[java]     at org.mozilla.javascript.gen.c1._c69(Unknown Source)
[java]     at org.mozilla.javascript.gen.c1.call(Unknown Source)
[java]     at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
[java]     at org.mozilla.javascript.gen.c1._c40(Unknown Source)
[java]     at org.mozilla.javascript.gen.c1.call(Unknown Source)
[java]     at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:97)
[java]     at org.mozilla.javascript.gen.c1._c42(Unknown Source)
[java]     at org.mozilla.javascript.gen.c1.call(Unknown Source)
[java]     at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:3335)
[java]     at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:2484)
[java]     at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:162)
[java]     at org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2347)
[java]     at org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:272)
[java]     at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:127)
[java]     at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
[java] js: exception from uncaught JavaScript throw: java.lang.OutOfMemoryError: GC overhead limit exceeded

我在这里广泛记录了我们的问题

特别是,我注意到:

If I run my build straight from the CL as a Java command, with the ' --optimize shrinksafe" switch, it fails, but without it succeeds. (running it with internStrings alone seems to cause other errors).

Not sure what to make of this, since I believe that oprtimize defaults to shrinksafe, but I have determined the following:

WORKS:

c:\temp\dojo-release-1.7.3rc1-src\util\buildscripts>java -Xms256m -Xmx256m -cp ../shrinksafe/js.jar;../closureCompiler/compiler.jar;../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main ../../dojo/dojo.js baseUrl=../../dojo load=build -p C:\company\builds\head\build\generated\general\comComplete.profile.js --action release --releaseDir C:\company\builds\head\build\generated\general\htdocs\company\javascript\1420

BROKEN (out of memory errors):

c:\temp\dojo-release-1.7.3rc1-src\util\buildscripts>java -Xms256m -Xmx256m -cp ../shrinksafe/js.jar;../closureCompiler/compiler.jar;../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main ../../dojo/dojo.js baseUrl=../../dojo load=build -p C:\company\builds\head\build\generated\general\comComplete.profile.js --action release --releaseDir C:\company\builds\head\build\generated\general\htdocs\company\javascript\1420 --optimize shrinksafe --internStrings true

Unfortunately, the following ant script target continues to fail with memory errors:

BuildNum: ${buildNum}

  <path id="js.path">             <pathelement location="${basedir}"/>
  </path>

  <pathconvert targetos="unix" property="js.path.unix" refid="js.path"

/> js.path.unix: ${js.path.unix}

  <!-- clean unpack and output dirs -->       <delete

dir="${outputDir}/htdocs/company/javascript/src/" />

  <copy file="${externalDir}/dojo/companyComplete.profile.js"

tofile="${outputDir}/companyComplete.profile.js" filtering="yes" overwrite="yes">

  <java fork="true"
      dir="${outputDir}/htdocs/company/javascript/src/util/buildscripts"
      classname="org.mozilla.javascript.tools.shell.Main"

failonerror="true"> --> --> --> -->


更新 1

我还尝试了以下内容:

<jvmarg value="-Xms5120m"/>
<jvmarg value="-Xmx5120m"/>

同时,也可以在ant java任务本身上使用maxmemory设置。


1
我理解增加可用内存不是一个选项吗?256m对于构建来说似乎相当小。使用1g会成功吗? - jjathman
我已经尝试使用高达5个G的堆空间,但仍然无法解决问题。(感谢您的关注) - mtyson
1
从 http://singztechmusings.wordpress.com/2011/01/05/how-to-resolve-java-lang-outofmemoryerror-gc-overhead-limit-exceeded-in-jboss/ 可能尝试禁用该错误?我猜这不会有帮助,但值得一试。添加此标志以禁用特定异常 -XX:-UseGCOverheadLimit - jjathman
在这种情况下,我会得到 js: exception from uncaught JavaScript throw: java.lang.OutOfMemoryError: Java heap space - mtyson
1个回答

3

最后找到了问题所在,releaseDir开关的值中有windows和unix文件分隔符。在Dojo < 1.6中这样做很正常,而且通常Java也没有问题。但由于某种原因,Dojo 1.7构建系统在这种情况下会遇到内存问题。

解决了问题之后,经过解析ant tokens,releaseDir包含了unix和windows文件分隔符的混合体:

<arg value="releaseDir=${output.dir}/path/foo/bar" /> 
-> Became -> 
releaseDir=blah\blah\blah/path/foo/bar

这就足以导致构建在“写入资源”时锁死,然后崩溃并出现“堆空间不足”的错误。(这通常是Java可以轻松处理的事情)。

修复方法很简单:

<path id="dojo.output.tmp">
    <pathelement location=" ${output.dir}/path/foo/bar "/>
</path>

<pathconvert targetos="unix" property="dojo.output.dir" refid="dojo.output.tmp" />
...
<arg value="releaseDir=${dojo.output.dir}" />

1
我在没有使用Ant的情况下遇到了同样的问题,只是尝试使用Windows在1.8.2下使用批处理文件进行构建。如果您在定义releaseDir时不使用Unix样式“/”,似乎会出现问题。如果您使用Windows样式“\”,则会在writeResources时出现内存错误,如所述。 - Kenneth Benjamin

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