оригинальное название:GraalVM — введение в JVM следующего уровня
Red Hat анонсировала Quarkus как…
Платформа Java следующего поколения для Kubernetes, адаптированная для GraalVM и HotSpot, созданная с использованием лучших в своем классе библиотек и стандартов Java.
Quarkus, показанный Red HatПример проектаЯ был впечатлен скоростью запуска и потреблением памяти. Одна из основных причин, по которой это впечатляет, заключается в том, что код написан с использованием GraalVM.заблаговременно (AOT)Компилировать в собственный образ (native image)из. Чтобы помочь вам лучше понять разницу между традиционной JVM HotSpot и GraalVM, я познакомлю вас с GraalVM, ее функциями и историей в этом сообщении блога.
TL;DR:GraalVM — это расширение JVM, написанное на чистом Java, разработанное Oracle, которое поддерживает полиглотное программирование и упреждающую компиляцию.
История виртуальной машины Java HotSpot
В течение многих лет HotSpot была основной виртуальной машиной Java, поддерживаемой и распространяемой Oracle для запуска программ Java. Выпущенный в 1999 году механизм производительности Java HotSpot был первоначально разработан компанией Animorphic, которая была приобретена Sun Microsystems и теперь принадлежит Oracle. Эта виртуальная машина в основном написана на C/C++ и становится все более и более сложной (примерно 250 000 строк кода в 2007 году).
Основной целью HotSpot JVM является запуск байт-кода Java (файлы .class) и постоянный анализ производительности программы для поиска так называемых горячих точек, которые часто выполняются в программе, и мгновенных (JIT, полное название)just-in-time), чтобы скомпилировать его в собственный код (машинный код) для повышения производительности. Это делается во время выполнения, а не до выполнения Java-программы, поэтому это происходит немедленно (just-in-time)из.
Рабочий процесс для запуска кода Java в HotSpot JVM выглядит следующим образом (упрощенно):
Виртуальная машина HotSpot в основном интерпретирует байт-код Java, предоставленный программой, но когда во время работы программы обнаруживается подходящая для оптимизации часть, она также со временем компилирует эту часть байт-кода в машинный код.
При компиляции метода с помощью JIT-компилятора при вызове метода jvm будет выполнять скомпилированный машинный код напрямую, а не интерпретировать его для повышения производительности. Поскольку компиляция машинного кода требует процессорного времени и памяти, JVM должна решать во время выполнения, какие методы компилировать, поскольку компиляция всех методов непосредственно в машинный код влияет на производительность.
Изменения в версии Java 9
С Java 9, особенноJEP 295, JDK получилзаблаговременно (AOT)Компилятор jaotc. Этот компилятор использует проект OpenJDK.GraalГенерация внутреннего кода выполняется по следующим причинам:
JIT-компиляторы работают быстро, но Java-программы могут быть настолько большими, что для полного прогрева JIT требуется много времени. Редко используемые методы Java могут вообще не компилироваться, что может привести к снижению производительности из-за повторных обращений к интерпретации.
Проект Graal OpenJDKДемонстрирует, что компилятор, написанный на чистой Java, может генерировать высокооптимизированный код. С помощью этого компилятора AOT и Java 9 вы можете заранее вручную скомпилировать код Java. Это означает создание машинного кода перед выполнением, а не во время выполнения, как это делают JIT-компиляторы, что является первым экспериментальным подходом.
# using the new AOT compiler (jaotc is bundeled within JDK 9 and above)
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
# with Java 9 you have to manually specify the location of the native code
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld
Это сократит время запуска, поскольку JIT-компилятору не нужно прерывать выполнение программы. Основным недостатком этого подхода является то, что сгенерированный машинный код зависит от платформы, на которой работает программа (Linux, MacOS, Windows...). Это может привести к тому, что скомпилированный код AOT будет привязан к конкретной платформе.
Архитектура GraalVM
На основе компилятора Graal компания Oracle приступила к разработке GraalVM, которая не только работает со сложной кодовой базой C/C++ JVM HotSpots, но и решает текущую проблему многоязычной миграции с помощью виртуальной машины, написанной на Java.
Архитектура GraalVM выглядит следующим образом:
Во-первых, вы можете заметить наличие некоторых языков, отличных от JVM. Теперь на этой универсальной виртуальной машине можно запускать код Ruby, R или JavaScript. Просто потому, что GraalVM использует фреймворк Truffle. Truffle — это библиотека с открытым исходным кодом для создания реализаций языков программирования, которые действуют как интерпретаторы самомодифицирующихся абстрактных синтаксических деревьев. С помощью этой функции теперь вы можете писать и выполнять, например, код JavaScript в кодовой базе Java.
Кроме того, GraalVM предоставляет следующие функции для предварительной компиляции программ в собственные исполняемые файлы:
GraalVM позволяет заранее компилировать программы в собственные исполняемые файлы. Полученная программа не может работать на виртуальной машине Java HotSpot, но использует необходимые компоненты, такие как управление памятью, планирование потоков из другой реализации виртуальной машины (называемой Substrate VM). SubstrateVM написан на Java, а затем скомпилирован в собственный исполняемый файл. Полученные программы имеют более быстрое время запуска и меньшие накладные расходы памяти во время выполнения по сравнению с виртуальной машиной Java.
Скомпилируйте и запустите свою первую Java-программу с помощью GraalVM
На момент написания этой статьи GraalVM доступен в двух редакциях: Community Edition (CE) и Enterprise Edition (EE), доступных только для Mac OS X и Linux. Чтобы использовать GraalVM в Windows во время разработки, вы можете использовать официальный образ Docker от Oracle, который используется в следующих примерах.
Представьте себе следующий простой класс HelloWorld:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Перед компилятором AOT для GraalVM и Java 9 вы выполняли такой код:
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
С GraalVM теперь вы можете запускать приложение существующим способом (JVM HotSpot) или использовать компилятор GraalVM AOT для создания собственного образа и запуска исполняемого файла:
$ javac HelloWorld
$ native-image HelloWorld
$ ./helloworld
HelloWorld!
В этом примере с HelloWorld повышение производительности тривиально, но в более крупных и реалистичных приложениях повышение производительности является значительным.
Пример простого полиглот-приложения можно найти в официальном руководстве по началу работы с GraalVM:
import java.io.*;
import java.util.stream.*;
import org.graalvm.polyglot.*;
public class PrettyPrintJSON {
public static void main(String[] args) throws java.io.IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.lines().collect(Collectors.joining(System.lineSeparator()));
try (Context context = Context.create("js")) {
Value parse = context.eval("js", "JSON.parse");
Value stringify = context.eval("js", "JSON.stringify");
Value result = stringify.execute(parse.execute(input));
System.out.println(result.asString());
}
}
}
Этот класс Java отвечает за красивую печать JSON с использованием методов JavaScript JSON.parse() и JSON.stringify() . Нативный образ этого класса можно построить следующим образом:
$ javac PrettyPrintJSON.java
$ native-image --language:js PrettyPrintJSON
$ ./prettyprintjson < prettyMe.json
{
"GraalVM": {
"description": "Language Abstraction Platform",
"supports": [
"combining languages",
"embedding languages",
"creating native images"
],
"languages": [
"Java",
"JavaScript",
"Node.js",
"Python",
"Ruby",
"R",
"LLVM"
]
}
}
Теперь можно измерить разницу в производительности между запуском нативного образа и запуском приложения в HotSpot:
$ time bin/java PrettyPrintJSON < prettyMe.json > /dev/null
real 0m1.101s
user 0m2.471s
sys 0m0.237s
$ time ./prettyprintjson < prettyMe.json > /dev/null
real 0m0.037s
user 0m0.015s
sys 0m0.016s
На мой взгляд, Oracle и GraalVM очень хорошо справились с доминированием Java как языка программирования. Кроме того, этот шаг повышает устойчивость и развитие функций самого языка Java. С полиглотной архитектурой это также увеличивает внедрение других языков программирования.
вы можете найти в моемРепозиторий GitHubНайдите примеры в и попробуйте непосредственно на GraalVM (Mac и Linux) или на Docker в Windows (обязательно предоставьте Docker не менее 6 ГБ ОЗУ и 2–4 ядра).
Оригинальный адрес:Японско-русский Sky Thunderbolt./что такое-личное АА…
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
Добро пожаловать в блог автора:blog.dongxishaonian.tech