Новые возможности AppCDS Java 10

Java задняя часть JVM Oracle

Оракул вчераОбъявлен общедоступный выпуск Java 10, за исключением Java 10Вывод типа локальной переменнойКроме того, возможности оригинальной CDS были расширены доAppCDS.

Что такое CDS

Полное название CDS — Class-Data Sharing. Функция CDS — позволить классу предварительно обрабатываться и помещаться в файл архива. Когда запускается последующая программа Java, файл архива может быть непосредственно перенесен с ним, так что JVM может напрямую отображать файл архива в память, чтобы сэкономить время запуска приложения.

Эта функция была фактически представлена ​​в JDK 1.5, но CDS может работать только с классами, загруженными загрузчиком классов Boot, а не с классами, загруженными загрузчиком классов приложений или пользовательским загрузчиком классов, что на самом деле немного безвкусно, и это бизнес Oracle JDK. ., которой нет в OpenJDK.

На этот раз в Java 10 CDS расширен до AppCDS, Как следует из названия, AppCDS может работать не только с загрузчиком классов Boot, но также с загрузчиком классов приложений и пользовательским загрузчиком классов, что значительно расширяет область применения CDS. AppCDS дает Java-приложениям два преимущества:

  • Это может повысить скорость запуска некоторых крупных приложений Java.
  • Это может повысить скорость запуска бессерверных приложений. Я думаю, что это может быть основной причиной, по которой Java 10 предоставляет AppCDS. Бессерверные версии, вероятно, станут очень распространенной формой будущих приложений, и применение Java к бессерверным приложениям имеет большое значение по сравнению с другими языками. Недостатком является то, что запуск скорость JVM слишком медленная, хотя, как и AWS Lambda, она добавит приложения Java Serverless.-clientДля запуска в режиме клиента, чтобы ускорить запуск, но фактический эффект очень мал. С помощью AppCDS скорость запуска бессерверных приложений может быть значительно увеличена.Согласно JEP AppCDS, для JEdit AppCDS может увеличить скорость запуска JEdit на 20-30%.

Попробуйте AppCDS

Автор написал простое Java-приложение для проверки эффекта AppCDS. Код программы помещен вGithubВыше вы можете перейти непосредственно к просмотру, здесь приведены только приблизительные этапы работы и окончательный тестовый эффект.

1. Решите, какие классы выгружать

Вообще говоря, приложение Java будет содержать много файлов классов, но не все файлы классов будут использоваться во время работы, поэтому на первом этапе нам нужно решить, какие файлы классов использовать. ваша команда запуска:

-Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst

Значения нескольких параметров:

  • -Xshare:off: Этот параметр означает, что не нужно делать какой-либо общий доступ к памяти, то есть не использовать файлы, сгенерированные AppCDS, для сопоставления памяти. Поскольку именно он определяет, какие типы памяти выгружать в архив, этот параметр необходимо отключить.
  • -XX:+UserAppCDS: AppCDS не будет включен по умолчанию, поэтому нам нужно добавить этот параметр, чтобы включить AppCDS.
  • -XX:DumpLoadedClassList: Указывает файл, в который должно быть записано имя класса, которое необходимо выгрузить.

После выполнения этой команды появится файл hello.lst, содержащий одно за другим имена классов.Ниже приведен скриншот части содержимого:

2. Скидываем память класса в архив

После того, как есть список классов, которые нужно сбросить, на втором шаге мы можем сбросить память класса в файл архива, на этом шаге нам нужно добавить следующие параметры к параметрам JVM:

-Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa

Значения некоторых параметров следующие:

  • -Xshare:dump: указывает, что дамп памяти класса должен быть выполнен сейчас.
  • -XX:SharedClassListFile: Используется для указания списка классов, которые необходимо сбросить.
  • -XX:SharedArchiveFile: Указывает, в какой архивный файл необходимо сбросить память класса.

После выполнения вышеуказанной команды мы получаемhello.jsaФайл, содержащий дамп необходимой информации о памяти.

3. Используйте сброшенный архив для ускорения запуска приложения

С предыдущим архивным файлом мы можем ускорить скорость запуска приложения.Чтобы использовать вышеуказанный архивный файл, нам нужно добавить следующие параметры в JVM:

-Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa

Значения некоторых параметров следующие:

  • -Xshare:on: указывает на открытое отображение памяти.
  • -XX:SharedArchiveFile=hello.jsa: Указывает, что архивный файл, используемый для сопоставления памяти,hello.jsa.

4. Проверьте эффект

На моей локальной машине эффект отказа от использования AppCDS и использования AppCDS следующий:

Не использовать AppCDS

Использование AppCDS

Видно, что для такого простого приложения AppCDS по-прежнему имеет улучшение скорости запуска примерно на 20%.Конечно, много времени запуска этого приложения тратится на загрузку классов, а остальное время не так много, поэтому эффект очень хороший.. Если время запуска других приложений тратит меньше времени на загрузку классов, эффект может быть не таким выраженным.

яма

Кажется, что AppCDS очень красив, но у меня есть несколько ям, когда я его использую:

  • Хотя AppCDS утверждает, что поддерживает пользовательский ClassLoader, я попробовал приложение SpringBoot и обнаружил, что-classpathклассы в пакете JAR, указанном в , не будут иметь никакого эффекта.
  • Если вы загружаете Oracle JDK, вам нужно добавить-XX:+UnlockCommercialFeatureчтобы открыть AppCDS, но OpenJDK не используется, что очень странно, 😅