
Ускоряем сборку Java-проектов: как мы сделали javac быстрее в Axiom JDK Express
Проблема: долгая сборка Java-проектов
Каждый Java-разработчик знает, сколько времени и ресурсов уходит на сборку Java-проектов. При использовании стандартных инструментов в разных проектах от 35% до 50% времени сборки тратится только на компиляцию. Но самое интересное — значительная часть этих затрат приходится не на саму компиляцию, а на “разогрев” виртуальной машины.
Дело в том, что javac — компилятор Java — сам написан на Java. Это значит, что сам javac запускается небыстро.
Наше решение: AOT-компиляция javac
Мы применили к javac (как к обычному Java-приложению) AOT-компиляцию (ahead-of-time, компиляция перед исполнением) с помощью Axiom NIK Pro — компилятора GraalVM с патчами от нашей компании. Так мы преобразовали байткод javac в нативный машинный код конкретной платформы, поэтому при запуске преобразованного приложения не тратится время на разогрев.
Каких результатов мы добились:
- Ускорили работу компилятора javac почти в 2 раза
- Сократили общее время сборки проектов на 10-20%
- Значительно снизили потребление CPU и памяти
Ускорение можно увидеть на графиках, полученных из снятых профилей производительности при компиляции модуля jdk.compiler
.
Ниже вы увидите графики потребления CPU и памяти, где красным цветом показаны расход памяти и процессора оригинальным компилятором javac при компиляции собственных исходников, а зелёным – этот же компилятор, но уже после AOT.
График потребления CPU
Потребление памяти
Выводы
Мы исключили необходимость:
- Загрузки и инициализации JVM при каждом запуске javac
- JIT-компиляции во время работы
- Повторной загрузки одних и тех же классов
В результате наш компилятор запускается практически мгновенно и работает с максимальной эффективностью.
Как начать использовать наше решение?
Мы уже выложили Axiom JDK Express 21 Early Access с ускоренным javac. Скачать его можно в личном кабинете разработчика. Мы сделали интеграцию максимально простой, чтобы не пришлось переписывать код приложения.
Интеграция с Maven:
Добавьте в ваш pom.xml профиль:
<profile>
<id>native_build</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<fork>true</fork>
<executable>/путь/до/jdk/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
</profile>
Запускайте сборки так: mvn <target> -Pnative_build
.
Интеграция с Gradle:
Создайте в проекте файл customjavac.gradle.kts
со следующим содержимым:
allprojects {
plugins.withId("java-base") {
tasks.withType<JavaCompile>().configureEach {
options.forkOptions.executable = "/путь/до/jdk/bin/javac"
options.isFork = true
}
}
}
И запустите сборку: ./gradlew --init-script customjavac.gradle.kts <target>
.
Почему стоит выбрать наше решение?
- Экономия времени — мы сокращаем время сборки на 10-20%, давая вам больше времени на разработку
- Экономия ресурсов — наше решение потребляет меньше CPU и памяти, экономя вашу CI/CD-инфраструктуру
- Простота внедрения — мы минимизировали изменения конфигурации для максимального результата
- Наша поддержка — наши эксперты всегда готовы помочь с интеграцией и настройкой
Axiom JDK Express — это не просто ускоренный javac, а часть нашего комплексного решения для высокопроизводительной Java-разработки. Попробуйте уже сегодня и почувствуйте разницу!