在我的JavaScript(https://gist.github.com/also/005fd7c200b20f012e10)上运行jjs
或ScriptEngine#eval
会因此异常而崩溃,而且没有更多详细信息:
Exception in thread "main" java.lang.RuntimeException: Method code too large!
at jdk.internal.org.objectweb.asm.MethodWriter.getSize(MethodWriter.java:2065)
at jdk.internal.org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:856)
at jdk.nashorn.internal.codegen.ClassEmitter.toByteArray(ClassEmitter.java:577)
at jdk.nashorn.internal.codegen.CompilationPhase$8.transform(CompilationPhase.java:396)
at jdk.nashorn.internal.codegen.CompilationPhase.apply(CompilationPhase.java:513)
at jdk.nashorn.internal.codegen.Compiler.compile(Compiler.java:361)
at jdk.nashorn.internal.runtime.Context.compile(Context.java:1071)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:1019)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:490)
at jdk.nashorn.tools.Shell.runScripts(Shell.java:306)
at jdk.nashorn.tools.Shell.run(Shell.java:168)
at jdk.nashorn.tools.Shell.main(Shell.java:132)
at jdk.nashorn.tools.Shell.main(Shell.java:111)
如何弄清楚导致方法代码过大的原因?我已经尝试了jjs
(--log=codegen:info
)的一些日志选项,但我还没有看到任何指向罪魁祸首的内容。
我已经使用Java版本1.9.0-ea-b34和1.8.0_20-b26进行了测试。
答案 0 :(得分:5)
Nashorn尝试将过大的脚本/函数拆分为较小的块以编译为字节码,以解决JVM强加的每个方法字节码大小限制。 Nashorn分离器在jdk 1.8.0更新40中得到了改进(正在开发,尚未发布 - 但可以从https://jdk8.java.net/download.html获得早期访问。您可能也想尝试一下。
答案 1 :(得分:3)
当前的JDK 8u40仍在抛出这个bug。请参阅以下详细说明:
http://skrishnamachari.wordpress.com/2014/06/18/nashorn-bug/
还有可能访问最新的Nashorn源以便能够快速调试。 Atleast找到一个黑客/验证并坚持使用,直到提供最终补丁。