Dojo 1.7 Build: Out of Memory Errors

坚强是说给别人听的谎言 提交于 2019-12-10 15:54:34

问题


After upgrading to Dojo 1.7.3, our ant build that was working flawlessly for years on previous versions of Dojo is now completely non-operational due to out of memory errors:

[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

I have extensively documented our troubles here.

In particular, where I note:

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"> --> --> --> -->


Update 1

I've also tried it with:

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

And also using the maxmemory setting on the ant java task itself.


回答1:


Finally found the problem, the releaseDir switch value had both windows and unix file separators in it. That used to work fine in Dojo < 1.6 and typically Java has no problem with it. For some reason, the Dojo 1.7 build system hits memory problems in that case.

The releaseDir, after resolving the ant tokens from the question, had a mix of both unix and windows file separators:

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

And that was enough to cause the build to lock up at 'writing resources' and then crash with 'out of heap space'. (This is something Java normally handles without issue).

The fix was simple enough:

<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}" />


来源:https://stackoverflow.com/questions/11148947/dojo-1-7-build-out-of-memory-errors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!