Существует три основных способа, которыми GraalVM может помочь с Java-приложениями: сделать их быстрее с помощью современного JIT-компилятора, скомпилировать их в автономные нативные исполняемые файлы с мгновенным запуском и низким потреблением памяти и улучшить их с помощью библиотек или кода. на других поддерживаемых языках.
Этот краткий справочник представляет собой краткий обзор возможностей GraalVM на одной странице, а также основные параметры и команды, иллюстрирующие его возможности.

Вы можете скачать и распечатать его. Он аккуратно помещается на бумаге формата А4, так что вы можете повесить его в офисе и использовать как напоминание о том, что может делать GraalVM и какие параметры его включают. Не забудьте взять PDF-версию для печати, чтобы она выглядела аккуратно и четко. Обратите внимание, что если ваш принтер более удобен для форматов бумаги Letter в США, обязательно установите эту версию , она будет выглядеть лучше.
В этом посте мы рассмотрим информацию в кратком справочнике и опишем ее более подробно.
Первая часть посвящена запуску Java-приложений. Прежде всего, следует помнить, что дистрибутивы GraalVM содержат JDK со всеми обычными инструментами JDK, что означает, что вы можете использовать GraalVM в качестве своего JDK. Например, компиляция исходного кода Java с помощью javac
утилиты:
javac MyApp.java
Естественно, вы также можете использовать GraalVM для запуска приложений Java или любых других языков JVM. В дополнение к возможности запускать Java, GraalVM обладает мощным JIT-компилятором и обеспечивает высочайшую производительность, которая часто позволяет запускать их быстрее, чем другие JDK.
java -jar MyApp.jar
При своевременном запуске Java-приложений с помощью GraalVM базовой JVM является обычная виртуальная машина Java Hotspot ™, что означает, что большинство параметров конфигурации эквивалентны, например, указание пути к классам для вашего приложения работает следующим образом:
java -cp target/myapp.jar com.example.Main
Компилятор GraalVM обычно запускается в режиме прекомпиляции в собственную разделяемую библиотеку . Но его код написан на Java, и его можно использовать как файл JAR, что приводит к несколько иному профилю производительности: использование кучи памяти для компиляции за счет более длительного прогрева (например, Java-код компилятора должен компилировать). Следующая опция настраивает режим, в котором вы хотите работать (включен +
по умолчанию):
-XX:+-UseJVMCINativeLibrary
Помимо запуска компилятора в виде JAR или собственной библиотеки, вы можете указать конфигурацию для оптимизации , выбрав economy
для более быстрого прогрева и enterprise
для наилучшей пиковой производительности (конечно, требуется GraalVM Enterprise).
-Dgraal.CompilerConfiguration=enterprise|community|economy
Воздействие JIT-компилятора может быть значительным, ускоряя приложения довольно сильно, но иногда неясно, работает ли компилятор, действительно ли код достигает верхнего уровня и какие методы попадают в компилятор.
-Dgraal.PrintCompilation=true
В дополнение к просмотру журналов вы можете включить больше вывода отладки, например, распечатать графики компилятора, чтобы проанализировать их для поиска дополнительных возможностей оптимизации:
-Dgraal.Dump=:2
И, конечно же, другие функции JVM также работают с GraalVM. Например, вы можете подключить агент Java, который будет обрабатывать код, генерировать классы во время выполнения и выполнять другие «агентские» функции Java. Работают как агенты на основе Java, так и собственные агенты. Одним из ярких примеров может быть агент вспомогательной настройки для упрощения сборки собственного образа.
-javaagent:path/to/jar.jar
-agentlib:path/to/native/agent
Вторым важным преимуществом использования GraalVM являются его возможности Native Image : заблаговременная компиляция вашего приложения в собственный двоичный файл.
Обновление: мы опубликовали отдельный краткий справочник по native-image, пожалуйста, ознакомьтесь с ним: Краткий справочник по исходному изображению .
Для того, чтобы использовать это, вам нужно установить native-image
компонент. Один из способов сделать это — загрузить JAR-файл компонента для вашего дистрибутива GraalVM и выполнить следующее:
gu install -L native-image.jar
Затем вы можете использовать установленную native-image
утилиту для подготовки собственного двоичного файла вашего приложения:
native-image [options] MyClass
Кроме того, вы можете использовать синтаксис файла JAR, аналогичный java
команде.
native-image -jar MyApp.jar
Запустите полученный двоичный файл как любой исполняемый файл:
./myApp
Если вместо исполняемого файла вы хотите создать разделяемую библиотеку , вы можете сделать это, передав --shared
опцию. Вам необходимо пометить методы, которые будут представлены, с помощью @CEntryPoint
аннотации, но более подробное изучение этой темы выходит за рамки этой статьи.
--shared
Еще одна очень полезная возможность — создавать статически связанные двоичные файлы , в которых библиотеки ОС, например libc
, связаны с исполняемым файлом. Можно даже выбрать, какую libc
реализацию использовать. glibc
используется по умолчанию, muslc
является опцией, для которой вам нужно немного подготовить среду сборки.
--static --libc=muslc
Можно включить инфраструктуру для запуска языков на основе Truffle: JavaScript, Ruby, Python, R и так далее. Это будет включать интерпретатор языка, инфраструктуру Truffle и JIT-компилятор, поэтому код можно будет скомпилировать во время выполнения для более быстрого выполнения.
Например, каждый из них будет включать поддержку соответствующего языка:
--language:js
--language:python
--language:llvm
--language:ruby
--language:js
Еще одна захватывающая возможность — оптимизация на основе профиля для исполняемых файлов собственных изображений. Вы можете сгенерировать инструментированный двоичный файл, применить к нему соответствующие рабочие нагрузки, записать профиль исполняемого кода аналогично тому, что делает JIT, и использовать эти профили для создания производственного двоичного файла.
native-image — pgo-instrument MyApp ./myApp native-image — pgo profile.iprof MyApp
И, если вы хотите иметь больше информации о том, что происходит во время процесса сборки собственного образа, например, пытаясь понять цепочку классов, через которую класс был инициализирован, вы можете использовать набор полезных параметров.
Отслеживание пути инициализации к определенному классу включается следующим:
-H:+TraceClassInitialization=package.class.Name
Сборка собственного образа — это процесс Java, поэтому вы можете поместить точку останова в код и подключить к нему отладчик, чтобы иметь полное представление о том, что происходит.
--debug-attach=[port]
В дополнение к этому существует множество других полезных параметров для настройки сборки собственного образа и поведения во время выполнения, которые мы рассмотрим в будущем, но вы можете получить общее представление о том, что доступно, используя опцию справки эксперта:
--expert-options-all
Третье важное преимущество, которое дает вам GraalVM, — это многоязычная среда выполнения , способная работать на нескольких языках и включающая платформу Node.js, работающую на движке GraalVM для JavaScript. Итак, если у вас есть приложение узла, вы можете запустить его, вызвав node
команду.
node myApp.js
Кроме того, существует ряд средств запуска языков, которые вы можете использовать для запуска программ на поддерживаемых языках:
js myApp.js
graalpython myApp.py
ruby myApp.rb
R myApp.r
lli myApp
Средства запуска, в том числе node
, по умолчанию запускаются в собственном режиме, где интерпретатор скомпилирован как собственный двоичный образ. Итак, чтобы включить взаимодействие с JVM для использования классов Java, используйте --jvm
опцию и для других языков --polyglot
:
--polyglot --jvm
Языковые движки имеют ряд функций для ограничения количества ресурсов , таких как, например, количество времени в миллисекундах, в течение которого контекст языка может выполняться:
--sandbox.MaxCPUTime=Nms
И последнее, но не менее важное: языки GraalVM имеют встроенную поддержку общих инструментов разработчика. Это одна из самых интересных частей всей экосистемы GraalVM — внедрите языковой интерпретатор, фиксирующий семантику языка, и получите мощную виртуальную машину, набор алгоритмов GC, отладчик, профилировщик, анализатор памяти и другие инструменты. бесплатно.
Укажите следующие параметры, чтобы включить соответственно отладчик на основе отладчика Chrome DevTools, профилировщик выборки, профилировщик трассировки и анализатор памяти:
--inspect
--cpusampler
--cputracer
--memsampler
Заключение
GraalVM — универсальный проект, предлагающий множество интересных возможностей, которые вы можете использовать для своих приложений, будь то Java, языки JVM, JavaScript, Ruby, Python, R и другие.
От использования лучшего своевременного компилятора до создания собственных исполняемых файлов ваших приложений и запуска компонентов на разных языках — вы можете использовать GraalVM уже сегодня.
В этом кратком справочнике мы попытались описать наиболее часто используемые параметры, описывающие различные возможности GraalVM.
Скачайте , распечатайте и прикрепите на стену. Надеюсь, он будет напоминать вам о том, насколько интересен проект GraalVM, даже если в настоящее время вы используете только часть того, что он может предложить.
А пока вы этим занимаетесь, получите дистрибутив GraalVM и попробуйте несколько вещей из краткого справочника, например, быстрее запускайте свои Java-приложения, сделайте микросервисы более дружественными к облаку с помощью нативных образов или улучшите свои приложения с помощью библиотек на других языках!
Статья является переводом medium.com