Оптимизация и ускорение Java-приложений с Liberica Native Image Kit

Оптимизация и ускорение Java-приложений с Liberica Native Image Kit


7 мая 2021 г.


Liberica Native Image Kit (Liberica NIK) — пакет разработчика с утилитой Native Image, преобразующей байт-код на языках JVM в предварительно скомпилированный исполняемый файл, который запускается автономно и почти моментально. Продукт основан на открытом коде проекта GraalVM Community Edition и собственных разработках BellSoft. Благодаря совместимости с различными платформами, в том числе легковесной ОС Alpine Linux с библиотекой musl, эта технология сокращает размер приложения и общее потребление ресурсов.

Ниже мы продемонстрируем, как Liberica NIK может облегчить работу Java-разработчика и какие проблемы решает.

Универсальный инструмент

Native Image — полезная технология для ускорения приложений. В одной из недавних статей для Хабра мы провели эксперимент: проверили, какая конфигурация микросервиса на Java потребует минимального объёма RAM и запустится быстрее всего. В сравнении с методами оптимизации виртуальной машины проект в виде native image (или «нативного образа») под Alpine Linux стартовал в 10 раз быстрее, за 0,1 секунды, затратив при этом в два раза меньше оперативной памяти. Эксперимент проводился с «достроенным» слоем glibc — тогда GraalVM ещё не был совместим с библиотекой musl, в которой заключается основной смысл и преимущество Alpine Linux.

Так перед инженерами BellSoft возникла задача привнести в GraalVM Open Source полноценную поддержку musl. Мы предложили четыре патча: на момент выхода этой статьи три уже интегрированы в код проекта, и один пока находится на рассмотрении.

Все изменения будут внесены непосредственно в систему сборки и код Graal. Они связаны с поддержкой дистрибутивов Linux, использующих musl в качестве стандартной библиотеки C, одним из которых является ОС Alpine Linux.

Наша команда занялась этими патчами, чтобы подготовиться к выпуску собственного продукта, объединяющего возможности библиотеки musl, GraalVM и Liberica JDK, бесплатного дистрибутива OpenJDK с открытым исходным кодом.

Так же как и в случае JEP 386, который мы недавно интегрировали в JDK 16, реализация нативной поддержки musl даёт 3 весомых преимущества:

Benefits

Кроме того, она существенно снижает время разработки, объём передаваемых данных и расходы в целом. В сфере ИТ распространен принцип «чем меньше, тем лучше»: снизив потребление ресурсов до минимума, ваш бизнес сможет извлечь максимум из проекта. Сочетание технологий Alpine и Native Image поможет сэкономить на размере образов, оперативной памяти и скорости запуска — пример с числовыми данными ждёт вас в следующем разделе.

Liberica Native Image Kit

Мы выпускаем компилятор Liberica Native Image Kit в виде JAR-архивов. Каждый пакет состоит из виртуальной машины Liberica VM, инструмента для создания нативного образа (разработанный на основе кода GraalVM CE) и языковых плагинов, совместимых с конкретными ОС.

Текущая версия сборок поддерживает следующие системные конфигурации:

  • операционные системы: Windows Server & Desktop x86_64, Linux x86_64 (glibc), Linux Alpine x86_64 (musl), Linux AArch64 (glibc), Linux Alpine AArch64 (musl), macOS 64_64
  • языки программирования: Java, JavaScript, LLVM, Python, Ruby, R и WebAssembly
  • дистрибутивы созданы на базе JDK 11.0.11 и Graal VM CE 21.1.0

Информация о том, какие языки доступны Liberica NIK на представленных платформах, содержится на странице Поддерживаемые конфигурации.

Эффективность нового инструмента лучше всего заметна на примерах. Проведём эксперимент. Созданный на фреймворке Spring микросервис сперва упакуем в JAR и запустим в контейнере на Debian 9. Затем скомпилируем то же приложение в нативный код с помощью Liberica NIK и соберём два контейнера: со слоем glibc под Debian 9 и с поддержкой musl под Alpine 3.11. Можете сравнить результаты в таблице ниже.

Table

Ещё одно преимущество Liberica NIK — бесшовная реализация многоязычных проектов, например микросервисов на различных языках программирования, особенно в комбинации с Alpine Linux. Покажем это через взаимодействие простого клиента на Node.js с сервером на Spring, которое имитирует работу микросервиса.

public class EchoApplication {
   public static void main(String[] args) {
       SpringApplication.run(EchoApplication.class);
   }
   @PostMapping("/")
   public String echo(@RequestBody String body) {
       return body;
   }
}

Руководство по установке

Далее следуют инструкции по установке Liberica NIK на различных платформах: Linux (Alpine musl представлен отдельно), macOS и Windows.

Apple macOS

Установка DMG образа в macOS

Откройте Центр загрузок: Liberica NIK в браузере. Нажмите «Скачать .DMG». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

shasum -a 1 bellsoft-liberica-vm-openjdk11-21.1.0-macos-amd64.dmg

Чтобы запустить установщик, дважды кликните на загруженный файл.

DMG content

Дважды кликните по иконке Install Liberica NIK Wizard.

Welcome screen

Нажмите «Continue».

Installation Type screen

Дополнительно можно сменить путь установки. Для этого нажмите «Change Install Location». Нажмите кнопку «Install», чтобы начать процесс установки.

Security Warning screen

Подтвердите установку ПО.

Installation Success screen

Нажмите «Close», чтобы закрыть окно установщика.

Liberica NIK будет установлен по пути /Library/Java/LibericaNativeImageKit/liberica-vm-21.1.0-openjdk11/. Вы можете использовать переменную среды $NIK_HOME, чтобы обратиться по пути установленного пакета — /Library/Java/LibericaNativeImageKit/liberica-vm-21.1.0-openjdk11/Contents/Home/.

Установка ZIP пакета в macOS

Для установки Liberica NIK скачайте архив .zip.

curl -O https://download.bell-sw.com/vm/21.1.0/bellsoft-liberica-vm-openjdk11-21.1.0-macos-amd64.zip

По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

shasum -a 1 bellsoft-liberica-vm-openjdk11-21.1.0-macos-amd64.zip

Распакуйте архив.

unzip bellsoft-liberica-vm-openjdk11-21.1.0-macos-amd64.zip
sudo mv bellsoft-liberica-vm-openjdk11-21.1.0 /Library/Java/LibericaNativeImageKit/

Liberica NIK будет распакован в каталог /Library/Java/LibericaNativeImageKit/. Добавьте подкаталог Contents/Home/bin в $PATH или пропишите /Library/Java/LibericaNativeImageKit/bellsoft-liberica-vm-openjdk11-21.1.0/Contents/Home/ как переменную среды $NIK_HOME, чтобы запускать Liberica NIK следующим образом:

$NIK_HOME/bin/java -jar $your_app

Чтобы запустить утилиту gu, используйте следующую команду:

$NIK_HOME/bin/gu available

Наконец, установите Native Image с помощью команды:

$NIK_HOME/bin/gu install native-image

Для деинсталляции Liberica NIK удалите этот каталог и соответствующие переменные среды.

Установка языковых плагинов в macOS

Запустите терминал и введите:

$NIK_HOME/bin/gu available

Откроется перечень поддерживаемых языков:

Downloading: Component catalog from download.bell-sw.com
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain           21.1.0              LLVM.org toolchain            Supported                     download.bell-sw.com
native-image             21.1.0              Native Image                  Early adopter                 download.bell-sw.com
nodejs                   21.1.0              Graal.nodejs                  Supported                     download.bell-sw.com
python                   21.1.0              Graal.Python                  Experimental                  download.bell-sw.com
R                        21.1.0              FastR                         Experimental                  download.bell-sw.com
ruby                     21.1.0              TruffleRuby                   Experimental                  download.bell-sw.com
wasm                     21.1.0              GraalWasm                     Experimental                  download.bell-sw.com

Выполните команду $NIK_HOME/bin/gu install [language] для установки конкретного языка. Например: $NIK_HOME/bin/gu install python.

Это действие можно также выполнить вручную:

curl -O https://download.bell-sw.com/vm/21.1.0/python-installable-openjdk11-21.1.0-macos-amd64.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-macos-amd64.jar

Linux

Установка DEB и RPM пакетов

Откройте Центр загрузок: Liberica NIK в браузере. Нажмите «Скачать .RPM» или «Скачать .DEB». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

shasum -a 1 bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.deb

Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.

Установите пакет с помощью соответствующего менеджера пакетов. Например, Apt:

apt install ./bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.deb

Или для RPM-based систем:

yum install ./bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.rpm

Пакет будет установлен в /opt/bellsoft/liberica-vm-21.1.0-openjdk11/.

Можно сохранить путь как переменную среды ${NIK_HOME}.

Установка автономного пакета JDK в GNU/Linux

Для установки Liberica NIK скачайте пакет .tar.gz.

wget https://download.bell-sw.com/vm/21.1.0/bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.tar.gz

По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

shasum -a 1 bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.tar.gz

Распакуйте его с помощью следующей команды:

export INSTALL_DIR=<your directory>
tar -C $INSTALL_DIR -xzf bellsoft-liberica-vm-openjdk11-21.1.0-linux-amd64.tar.gz

Эта команда распакует Liberica NIK в выбранный каталог. Добавьте $INSTALL_DIR/bellsoft-liberica-vm-openjdk11-21.0.0/bin в $PATH или пропишите $INSTALL_DIR/bellsoft-liberica-vm-openjdk11-21.0.0 как переменную среды $NIK_HOME и запустите Liberica NIK следующим образом:

$NIK_HOME/bin/java -jar $your_app

Чтобы запустить утилиту gu, используйте следующую команду:

$NIK_HOME/bin/gu available

Наконец, установите Native Image с помощью команды:

$NIK_HOME/bin/gu install native-image

Для деинсталляции Liberica NIK удалите этот каталог и соответствующие переменные среды.

Установка языковых плагинов в Linux

Запустите терминал и введите:

$NIK_HOME/bin/gu available

Откроется перечень поддерживаемых языков:

Downloading: Component catalog from download.bell-sw.com
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain           21.1.0              LLVM.org toolchain            Supported                     download.bell-sw.com
native-image             21.1.0              Native Image                  Early adopter                 download.bell-sw.com
nodejs                   21.1.0              Graal.nodejs                  Supported                     download.bell-sw.com
python                   21.1.0              Graal.Python                  Experimental                  download.bell-sw.com
R                        21.1.0              FastR                         Experimental                  download.bell-sw.com
ruby                     21.1.0              TruffleRuby                   Experimental                  download.bell-sw.com
wasm                     21.1.0              GraalWasm                     Experimental                  download.bell-sw.com

Выполните команду $NIK_HOME/bin/gu install [language] для установки конкретного языка. Например: $NIK_HOME/bin/gu install python.

Это действие можно также выполнить вручную:

wget https://download.bell-sw.com/vm/21.1.0/python-installable-openjdk11-21.1.0-linux-amd64.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-linux-amd64.jar

Alpine Linux

Установка автономного пакета JDK в GNU/Linux

Для установки Liberica NIK скачайте пакет .tar.gz.

wget https://download.bell-sw.com/vm/21.1.0/bellsoft-liberica-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz

По окончании процесса проведите проверку, сравнив размер файла на вашем диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

shasum -a 1 bellsoft-liberica-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz

Распакуйте его с помощью следующей команды:

export INSTALL_DIR=<your directory>
tar -C $INSTALL_DIR -xzf bellsoft-liberica-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz

Эта команда распакует Liberica NIK в выбранный каталог. Добавьте $INSTALL_DIR/bellsoft-liberica-vm-openjdk11-21.0.0/bin в $PATH или пропишите $INSTALL_DIR/bellsoft-liberica-vm-openjdk11-21.0.0 как переменную среды $NIK_HOME и запустите Liberica NIK следующим образом:

$NIK_HOME/bin/java -jar $your_app

Чтобы запустить утилиту gu, используйте следующую команду:

$NIK_HOME/bin/gu available

Наконец, установите Native Image с помощью команды:

$NIK_HOME/bin/gu install native-image

Для деинсталляции Liberica NIK удалите этот каталог и соответствующие переменные среды.

Установка языковых плагинов в Alpine Linux

Запустите терминал и введите:

$NIK_HOME/bin/gu available

Откроется перечень поддерживаемых языков:

Downloading: Component catalog from download.bell-sw.com
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain           21.1.0              LLVM.org toolchain            Supported                     download.bell-sw.com
native-image             21.1.0              Native Image                  Early adopter                 download.bell-sw.com
nodejs                   21.1.0              Graal.nodejs                  Supported                     download.bell-sw.com
python                   21.1.0              Graal.Python                  Experimental                  download.bell-sw.com
R                        21.1.0              FastR                         Experimental                  download.bell-sw.com
ruby                     21.1.0              TruffleRuby                   Experimental                  download.bell-sw.com
wasm                     21.1.0              GraalWasm                     Experimental                  download.bell-sw.com

Выполните команду $NIK_HOME/bin/gu install [language] для установки конкретного языка. Например: $NIK_HOME/bin/gu install python.

Это действие можно также выполнить вручную:

wget https://download.bell-sw.com/vm/21.1.0/python-installable-openjdk11-21.1.0-linux-x64-musl.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-linux-x64-musl.jar

Microsoft Windows

Установка с помощью Microsoft Windows Installer

Откройте Центр загрузок: Liberica NIK в браузере. Нажмите «Скачать .MSI». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в PowerShell:

(Get-FileHash .\bellsoft-liberica-vm-openjdk11-21.1.0-windows-amd64.msi -Algorithm SHA1).Hash

Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.

Чтобы запустить установщик, дважды кликните на загруженный файл.

Welcome

Нажмите «Next» на главном экране.

Features

Выберите нужные вам опции и нажмите «Next». Нажатие на опцию откроет её описание. Если сомневаетесь, пропустите этот этап и нажмите «Next».

Install

Пакет готов к установке, нажмите «Install».

* В других версиях операционной среды окно установщика может отличаться.

Чтобы установить Liberica NIK в «тихом» режиме, выполните следующую команду в PowerShell:

msiexec /quiet /i bellsoft-liberica-vm-openjdk11-21.1.0-windows-amd64.msi

Liberica NIK по умолчанию будет установлен в C:\Program Files\BellSoft\LibericaNIK-21-OpenJDK-11. Можно сохранить путь как переменную среды NIK_HOME.

Установка автономного пакета в Microsoft Windows

Откройте Центр загрузок: Liberica NIK в браузере. Нажмите «Скачать .ZIP». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:

(Get-FileHash .\bellsoft-liberica-vm-openjdk11-21.1.0-windows-amd64.zip -Algorithm SHA1).Hash

Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.

Альтернативой работе через GUI является инструмент PowerShell:

(New-Object System.Net.WebClient).DownloadFile("https://download.bell-sw.com/vm/21.1.0/bellsoft-liberica-vm-openjdk11-21.1.0-windows-amd64.zip", "liberica.zip")
Expand-Archive liberica.zip -DestinationPath .

Эта команда распакует Liberica NIK в текущий каталог. Добавьте подкаталог bin в PATH или сохраните путь как переменную среды NIK_HOME, чтобы запускать Liberica NIK следующим образом:

"%NIK_HOME%\bin\java.exe" -jar your_app.jar

Установка языковых плагинов в Windows

Запустите PowerShell и введите:

"%NIK_HOME%\bin\gu.cmd" available

Откроется перечень поддерживаемых языков:

Downloading: Component catalog from download.bell-sw.com
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
native-image             21.1.0              Native Image                  Early adopter                 download.bell-sw.com
nodejs                   21.1.0              Graal.nodejs                  Supported                     download.bell-sw.com
wasm                     21.1.0              GraalWasm                     Experimental                  download.bell-sw.com

Выполните команду "%NIK_HOME%\bin\gu.cmd" install [language] для установки конкретного языка. Например: "%NIK_HOME%\bin\gu.cmd" install nodejs.

Наконец, установите Native Image с помощью команды:

"%NIK_HOME%\bin\gu.cmd" install native-image

Уже готовы внедрить Native Image в свой проект, но не знаете, с чего начать? С надёжным партнёром процесс перехода на новую технологию пройдёт незаметно. Мы подготовили несколько кейсов и будем рады показать, как наши клиенты применяют Liberica NIK в среде Enterprise — абсолютно бесплатно. Во-первых, вы сэкономите время на подготовку программистов к миграции; во-вторых, сможете почерпнуть идей для своего бизнеса. Заполните форму, которая откроется по кнопке ниже, и в ближайшее время с вами свяжется инженер BellSoft.

Заключение

В следующий раз обсудим способы использования приложений в контейнерах, созданных с Liberica NIK. Очевидно, что этот инструмент предлагает серьёзные преимущества для разработки на языках JVM: экономию оперативной памяти, простой обмен данными между сервисами в рамках одного приложения и высокую скорость работы. Мы рады возможности внести свой вклад в проект Graal и объединить эту технологию со своими наработками в области поддержки musl. С нетерпением ждём новых решений от участников сообщества OpenJDK!

Author image

Alexander Belokrylov

BellSoft CEO

BellSoft LTD [email protected] BellSoft LTD logo Liberica Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 111 North Market Street, Suite 300 CA 95113 San Jose US +1 702 213-59-59