java - 排查Nashorn "Method code too large!"异常

标签 java javascript java-8 nashorn java-9

在我的 JavaScript ( https://gist.github.com/also/005fd7c200b20f012e10 ) 上运行 jjsScriptEngine#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 进行了测试。

最佳答案

Nashorn 尝试将太大的脚本/函数拆分成较小的 block 以编译为字节码,以解决 JVM 强加的每个方法字节码大小限制。 Nashorn 拆分器在 jdk 1.8.0 更新 40 中得到改进(正在开发,尚未发布 - 但可以从 https://jdk8.java.net/download.html 获得早期访问。您可能也想尝试一下。

关于java - 排查Nashorn "Method code too large!"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329503/

相关文章:

java - MYSQL SELECT ... FOR UPDATE 不起作用?

java - 编辑文本 : Attempted to finish an input event but the input event receiver has already been disposed

javascript - $state.go() 之后触发事件

javascript - 带有内圆的 Jquery 饼图

java - 是否可以使用 JDK 1.7 或更高版本在没有 main() 的情况下用 Java 编写程序?

java - 如何读取和解析一个大的 STL 文件?

java - 无需在浏览器中打开即可访问 URL,使用 Android 应用程序进行数字 LED 控制

javascript - 如何保存 svg 文件捕获的签名(以 HTML 形式呈现)

java - 在 Java 8 中迭代 2 个对象和 1 个嵌套对象

java - 在 StringUtils 中返回可选是否过度?