Как использовать функцию распределения данных класса приложений в java 10?

Я читал о CDS в Oracle doc https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

Я понял, что файлы системного класса, необходимые для загрузки jvm, анализируются, проверяются и затем сохраняются в архиве в jre/lib/[arch]/client/classes.jsa. Кроме того, они также обеспечивают отображение памяти для jvm, поэтому jvm непосредственно отображает память в соответствии с информацией о карте, указанной в архиве. Таким образом, это уменьшает накладные расходы на загрузку классов каждый раз, когда запускается экземпляр jvm. Пожалуйста, исправьте меня, если он ошибается.

Теперь, придя в java 10, как я могу добиться этого для моего кода приложения? Во-вторых, будет ли полный код приложения иметь право на CDS или существуют ли какие-то ограничения?

Ответ 1

Существует три основных шага для создания и использования архива с данными класса приложения (более подробно читайте в моем посте о совместном использовании данных класса приложения):

  1. Создание списка классов для включения в архив:

    java -XX:+UseAppCDS
        -XX:DumpLoadedClassList=classes.lst
        -jar app.jar
    
  2. Создание архива:

    java -XX:+UseAppCDS -Xshare:dump 
        -XX:SharedClassListFile=classes.lst
        -XX:SharedArchiveFile=app-cds.jsa
        --class-path app.jar
    
  3. Используя архив:

    java -XX:+UseAppCDS -Xshare:on 
        -XX:SharedArchiveFile=app-cds.jsa
        -jar app.jar
    

Имейте в виду следующее:

  • при создании архива нельзя использовать подстановочные знаки или разорванные файлы JAR для пути к классам
  • путь к классу, используемый для запуска приложения, должен иметь префикс, используемый для создания архива.
  • если у вас есть какие-либо проблемы, используйте -Xlog:class+load (подробнее о -Xlog), чтобы получить больше информации

Ответ 2

В JEP для AppCDS показан пример, показывающий, как добавить классы приложений в общий архив. Что касается ограничений, их немного:

  1. Прямые классы (.class), присутствующие в каталоге по пути класса, не могут быть добавлены в общий архив. Смотрите эту тему.
  2. Классы, загруженные пользовательскими загрузчиками классов, не могут быть добавлены в общий архив. Смотрите эту тему.

Есть и другие практические соображения, которые следует учитывать при использовании CDS/AppCDS, таких как:

  1. Если вы обновите файлы jar в файловой системе, вам придется воссоздать общий архив.
  2. Если вы используете Java или JVMTI-агент (агенты), которые изменяют/повторно трансформируют/переопределяют файл класса во время выполнения, то общий архив не будет полезен, поскольку классы будут загружаться с диска, поскольку агенты нуждаются в фактических которые я считаю, не хранятся в общем архиве.

Другая приятная и подробная статья о CDS и AppCDS - https://simonis.github.io/cl4cds/.

Автор статьи также написал инструмент, который позволяет использовать классы приложений, даже если они загружаются пользовательскими загрузчиками классов.

Если вы заинтересованы в использовании CDS, вы также можете попробовать OpenJ9 JVM, который имеет эту функцию в течение длительного времени и намного более зрелым и полным. Подробнее об этом читайте здесь.