- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
在标准 JDK 上运行 GraalJS
GraalJS 已针对作为 GraalVM 的一部分执行进行优化,主要推荐在 Java 应用程序中使用。这通过使用 Graal 编译器作为优化编译器,并可能使用 Native Image 将引擎提前编译为原生二进制文件,保证了最佳性能。
然而,可以在标准 Java VM(如 Oracle JDK 或 OpenJDK)上执行 GraalJS。在没有 Graal 编译器的情况下执行时,JavaScript 性能将显著降低。尽管标准 JVM 上可用的 JIT 编译器可以执行和 JIT 编译 GraalJS 代码库,但它无法将 GraalJS 优化到其最大性能潜力。本文档描述了如何在标准 Java VM 上运行 GraalJS,并展示了如何使用 Graal 编译器作为 JIT 编译器来保证最佳性能。
GraalJS 在 Maven Central 上 #
GraalJS 是开源的,并由社区定期推送到 Maven 中央仓库。您可以在 org.graalvm.polyglot:js
下找到它。
我们提供在 JDK 21(或更高版本)上运行并使用 Graal 编译器的嵌入式 Java 中的 GraalJS 示例项目
- Polyglot 嵌入式演示。一个简单的 JavaScript “Hello World” 应用程序的 Maven 和 Gradle 项目。
- JS Maven 演示。此示例包含一个用于 JavaScript 基准测试(质数生成器)的 Maven 项目。它允许用户比较 GraalJS 在有或没有 Graal 编译器作为优化编译器的情况下运行的性能。使用 Graal 编译器运行可以显著提高任何相对较大的 JavaScript 代码库的执行性能。本质上,示例 pom.xml 文件激活了 JVM 编译器接口 (JVMCI),并通过在
--module-path
和--upgrade-module-path
上提供 Graal 编译器来将其配置为 JIT 编译器。
ScriptEngine JSR 223 #
当 js-scriptengine.jar 包含在模块路径上时,GraalJS 可以通过 ScriptEngine
启动。引擎注册在几个不同的名称下,包括 Graal.js
、js
、JavaScript
和 javascript
。请注意,如果 Nashorn 引擎在模块路径上,它也可能在其名称下可用。
要从 ScriptEngine
启动 GraalJS,可以使用以下代码
new ScriptEngineManager().getEngineByName("Graal.js");
列出所有可用引擎
List<ScriptEngineFactory> engines = new ScriptEngineManager().getEngineFactories();
for (ScriptEngineFactory f : engines) {
System.out.println(f.getLanguageName() + " " + f.getEngineName() + " " + f.getNames());
}
检查设置 - 是否将 GraalVM 编译器用作 JIT 编译器? #
当 JavaScript 方法由 Graal 编译器编译时,--engine.TraceCompilation
选项会启用调试输出。运行时间足够长的 JavaScript 源代码将触发编译并打印日志输出
> function add(a,b) { return a+b; }; for (var i=0;i<1000*1000;i++) { add(i,i); }
[truffle] opt done add <opt> <split-c0875dd> |ASTSize 7/ 7 |Time 99( 90+9 )ms |DirectCallNodes I 0/D 0 |GraalNodes 22/ 71 |CodeSize 274 |CodeAddress 0x7f76e4c1fe10 |Source <shell>:1:1