- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 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 編譯器以保證最佳效能。
Maven Central 上的 GraalJS #
GraalJS 是開源的,並由社群定期推送到 Maven Central Repository。您可以在 org.graalvm.polyglot:js
下找到它。
我們提供了範例專案,在 JDK 21(或更新版本)上執行嵌入在 Java 中的 GraalJS,並使用 Graal 編譯器
- Polyglot Embedding Demo。適用於簡單 JavaScript「Hello World」應用程式的 Maven 和 Gradle 專案。
- JS Maven Demo。此範例包含一個用於 JavaScript 基準測試(質數產生器)的 Maven 專案。它讓使用者可以比較 GraalJS 在使用或不使用 Graal 編譯器作為最佳化編譯器時的效能。使用 Graal 編譯器執行可以顯著提高任何相對較大的 JavaScript 程式碼庫的執行效能。基本上,此範例的 pom.xml 檔案會啟用 JVM 編譯器介面 (JVMCI),並透過在
--module-path
和--upgrade-module-path
上提供 Graal 編譯器,將 JIT 編譯器設定為 Graal 編譯器。
ScriptEngine JSR 223 #
當 js-scriptengine.jar 包含在模組路徑中時,可以透過 ScriptEngine
啟動 GraalJS。該引擎會在數個不同的名稱下註冊,包括 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 編譯器? #
每當 Graal 編譯器編譯 JavaScript 方法時,--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