Как определено на домашней странице, Quarkus является «стеком Java для Kubernetes, созданным специально для OpenJDK HotSpot и GraalVM». Поскольку я большой поклонник OpenJ9 , я быстро измерил использование памяти моим реактивным примером приложения, где я запускаю микросервис один раз с OpenJ9 и один раз с HotSpot.
OpenJ9 — это Java JVM, которая была открыта из IBM 2-3 года назад. Это в основном та же JVM, которую IBM использует в сотнях продуктов и предложений. Приятно то, что по сравнению с Hotspot он обеспечивает не только ускорение запуска на 42%, но и сокращение объема памяти на 66%. Ознакомьтесь с документацией .
Я использовал OpenJ9 из AdoptOpenJDK, где вы можете выбирать между HotSpot и OpenJ9. Прочитайте мой предыдущий блог, чтобы понять, какие еще преимущества предоставляет AdoptOpenJDK.
Вы также можете прочитать:
Мысли о Quarkus
Результаты использования памяти
Вот результаты моего маленького теста. Диаграмма с сайта Quarkus. Все, что в оранжевом, — это то, что я добавил для OpenJ9.
Я запустил тот же сервис, который обращается к базе данных с OpenJ9 и HotSpot. Я развернул две версии сервиса с нуля и согрел их, вызвав их REST API. После этого я применил «статистику докеров | grep статей-реактив ». Горячая точка показала 149,8 МБ и OpenJ9 59,77 МБ.
Как запустить тесты
Я использовал мой пример приложения, которое является частью проекта cloud-native-starter . Микросервис предоставляет REST API, которые выполняют операции CRUD над базой данных PostgreSQL.
Чтобы запустить микросервис с OpenJ9 в Minikube, вызовите следующие команды.
Оболочка
1
$ git clone https://github.com/IBM/cloud-native-starter.git
2
$ cd cloud-native-starter/reactive
3
$ sh scripts/start-minikube.sh
4
$ sh scripts/deploy-kafka.sh
5
$ sh scripts/deploy-postgres.sh
6
$ sh scripts/deploy-articles-reactive-postgres.sh
7
$ curl ... [invoke command to trigger APIs returned by previous command]
8
$ docker stats | grep articles-reactive
Я использовал следующий Dockerfile :
SQL
xxxxxxxxxx
1
FROM adoptopenjdk/maven-openjdk11 as BUILD
2
COPY src /usr/src/app/src
3
COPY pom.xml /usr/src/app
4
WORKDIR /usr/src/app
5
RUN mvn package
6
7
FROM adoptopenjdk/openjdk11-openj9:ubi-minimal
8
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
9
ENV AB_ENABLED=jmx_exporter
10
RUN mkdir /opt/shareclasses
11
RUN chmod a+rwx -R /opt/shareclasses
12
RUN mkdir /opt/app
13
COPY --from=BUILD /usr/src/app/target/lib/* /opt/app/lib/
14
COPY --from=BUILD /usr/src/app/target/*-runner.jar /opt/app/app.jar
15
CMD ["java", "-Xmx128m", "-XX:+IdleTuningGcOnIdle", "-Xtune:virtualized", "-Xscmx128m", "-Xscmaxaot100m", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/app/app.jar"]
Чтобы использовать Hotspot, замените Dockerfile содержимым из Dockerfile.Hotspot и выполните те же команды.
SQL
xxxxxxxxxx
1
FROM adoptopenjdk/maven-openjdk11 as BUILD
2
COPY src /usr/src/app/src
3
COPY pom.xml /usr/src/app
4
WORKDIR /usr/src/app
5
RUN mvn package
6
7
FROM fabric8/java-alpine-openjdk11-jre
8
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
9
ENV AB_ENABLED=jmx_exporter
10
COPY --from=BUILD /usr/src/app/target/lib/* /deployments/lib/
11
COPY --from=BUILD /usr/src/app/target/*-runner.jar /deployments/app.jar
12
ENTRYPOINT [ "/deployments/run-java.sh" ]