【问题标题】:Is it possible to set the optimization level for RhinoScriptEngine in Java 6?是否可以在 Java 6 中设置 RhinoScriptEngine 的优化级别?
【发布时间】:2011-08-09 17:14:24
【问题描述】:

我遇到了 Rhino 在通过 javax.script.ScriptEngine API 运行 Rhino 时抛出 "Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit" 异常的问题。接受的解决方案似乎是在 sun.org.mozilla.javascript.Context 上调用 setOptimizationLevel(-1)

不幸的是,我似乎无法访问由ContextFactory 创建的Context。我尝试将ContextFactory.Listener 添加到ContextFactory.getGlobal(),这将在创建后修改Context,但我的听众似乎从未被调用过。我还查看了RhinoScriptEngine source from Java 6,看看是否有我可以设置的属性,ContextFactory 将从中读取以确定优化级别的值。

据我所知,在 Java 7 中,RhinoScriptEngine 默认将优化级别设置为 -1并且 可以通过 rhino.opt.level 属性设置优化级别。比较Java 7 version 中的makeContext() 方法和Java 6 version 中的makeContext() 方法,看看我的意思。

据我所知,我认为最好的选择是直接运行 Rhino,如图 in this example of using Rhino to run the CoffeeScript compiler。尽管如您所见,代码更加混乱,所以如果可能的话,我更愿意使用javax.script.ScriptEngine API,同时继续支持 Java 6。还有其他选择吗?

【问题讨论】:

  • 另一种选择是将 com.sun.script.javascript 包中的所有代码复制到一个新包中(或者可能是具有重命名类以访问包私有成员的相同包)并更改makeContext() 的实现来设置优化级别,但这似乎有点矫枉过正。
  • 我遇到了同样的问题。 JDK8中的'Nashorn'是一个更高级的JS引擎,Nashorn可以解决64K的问题。

标签: java rhino


【解决方案1】:

,根据文档:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

上面写着:

由于占用空间和安全原因,一些组件已被排除:

  1. JavaScript 到字节码的编译(也称为“优化器”)。这 功能取决于类生成库。去除这个 功能意味着 JavaScript 将始终被解释。这 删除此功能不会影响脚本执行,因为 优化器是透明的。

已排除优化器类以将其与 JDK6 捆绑,因此无法为 java 6 设置优化级别。

【讨论】:

  • 但这不等同于优化级别 -1,这正是 OP 想要的吗?如果 Java 6 总是被解释,那么代码生成编译错误肯定不会发生。
【解决方案2】:

我正在运行 6,它似乎也默认设置为 -1。或者更确切地说,除非 sun.org.mozilla.javascript.internal.optimizer.Codegen 在类路径中,否则它会设置为 -1。

【讨论】:

  • 嗯,一个问题可能是我使用的是OpenJDK: $ java -version java version "1.6.0_22" OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~ 11.04.1) OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) Sun JDK 似乎与 Rhino 有一些不同。我们必须做一些非常奇怪的事情才能让我的项目在两个 JDK 上都能正常工作,plovr:code.google.com/p/plovr/source/detail?r=7e3cad7f1b9d
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2013-02-24
  • 2020-11-23
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
相关资源
最近更新 更多