闭包编译器(ccjs)内存不足错误

Closure Compiler (ccjs) out of memory error

本文关键字:内存不足 错误 ccjs 编译器 闭包      更新时间:2023-09-26

我正试图通过node package manager安装闭包编译器来减少我的javascript代码(有172k行),但它失败了,并出现了"内存不足错误":

$ ccjs ./static/ui.jsexe/all.js --compilation_level=ADVANCED_OPTIMIZATIONS > ./static/ui.jsexe/all.min.js                                                                              
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2245)
        at java.util.Arrays.copyOf(Arrays.java:2219)
        at java.util.ArrayList.grow(ArrayList.java:213)
        at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
        at java.util.ArrayList.add(ArrayList.java:411)
        at com.google.javascript.jscomp.parsing.NewIRFactory.<init>(NewIRFactory.java:241)
        at com.google.javascript.jscomp.parsing.NewIRFactory.transformTree(NewIRFactory.java:289)
        at com.google.javascript.jscomp.parsing.ParserRunner.parse(ParserRunner.java:106)
        at com.google.javascript.jscomp.JsAst.parse(JsAst.java:84)
        at com.google.javascript.jscomp.JsAst.getAstRoot(JsAst.java:50)
        at com.google.javascript.jscomp.CompilerInput.getAstRoot(CompilerInput.java:118)
        at com.google.javascript.jscomp.Compiler.hoistNoCompileFiles(Compiler.java:1500)
        at com.google.javascript.jscomp.Compiler.parseInputs(Compiler.java:1404)
        at com.google.javascript.jscomp.Compiler.parse(Compiler.java:788)
        at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:743)
        at com.google.javascript.jscomp.Compiler.access$000(Compiler.java:93)
        at com.google.javascript.jscomp.Compiler$3.call(Compiler.java:655)
        at com.google.javascript.jscomp.Compiler$3.call(Compiler.java:652)
        at com.google.javascript.jscomp.Compiler$4.call(Compiler.java:699)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

我的机器上有16 GB,如何解决此问题?


看起来应该是https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/NewIRFactory.java#L245--它用文件中每一行换行符的索引填充ArrayList,因此仅列表的大小就为172K。

但是,如果在将所有JS传递给闭包编译器之前将其放在一个文件中,则可以考虑跳过该连接,并让闭包编译器通过在命令行(... --js=file1.js --js=file2.js)上传递单个文件或使用"glob"(... --js='src/scripts/*.js')来执行此操作。然后,它可以分别解析每个文件,这将使用更少的内存。

或者,您可以使用Xmx选项

来增加JVM使用的最大内存

好的,这个问题已经由项目开发人员解决了,希望没有人再面临这个问题。

https://github.com/dcodeIO/ClosureCompiler.js/issues/19