Ускоряем сборку Java-проектов: как мы сделали javac быстрее в Axiom JDK Express

Ускоряем сборку 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
График потребления CPU

Потребление памяти
Потребление памяти

Выводы

Мы исключили необходимость:

  1. Загрузки и инициализации JVM при каждом запуске javac
  2. JIT-компиляции во время работы
  3. Повторной загрузки одних и тех же классов

В результате наш компилятор запускается практически мгновенно и работает с максимальной эффективностью.

Как начать использовать наше решение?

Мы уже выложили 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>.

Почему стоит выбрать наше решение?

  1. Экономия времени — мы сокращаем время сборки на 10-20%, давая вам больше времени на разработку
  2. Экономия ресурсов — наше решение потребляет меньше CPU и памяти, экономя вашу CI/CD-инфраструктуру
  3. Простота внедрения — мы минимизировали изменения конфигурации для максимального результата
  4. Наша поддержка — наши эксперты всегда готовы помочь с интеграцией и настройкой

Axiom JDK Express — это не просто ускоренный javac, а часть нашего комплексного решения для высокопроизводительной Java-разработки. Попробуйте уже сегодня и почувствуйте разницу!



Author image

Сергей Лунегов

Директор по продуктам Axiom JDK

Axiom JDK info@axiomjdk.ru Axiom JDK logo Axiom Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 Axiom JDK 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67