Краткое руководство по GraalVM

Краткое руководство по GraalVM

by moiseevrus

Существует три основных способа, которыми 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

You may also like

Leave a Comment