Как использовать функцию распределения данных класса приложений в 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
Существует три основных шага для создания и использования архива с данными класса приложения (более подробно читайте в моем посте о совместном использовании данных класса приложения):
-
Создание списка классов для включения в архив:
java -XX:+UseAppCDS
-XX:DumpLoadedClassList=classes.lst
-jar app.jar
-
Создание архива:
java -XX:+UseAppCDS -Xshare:dump
-XX:SharedClassListFile=classes.lst
-XX:SharedArchiveFile=app-cds.jsa
--class-path app.jar
-
Используя архив:
java -XX:+UseAppCDS -Xshare:on
-XX:SharedArchiveFile=app-cds.jsa
-jar app.jar
Имейте в виду следующее:
- при создании архива нельзя использовать подстановочные знаки или разорванные файлы JAR для пути к классам
- путь к классу, используемый для запуска приложения, должен иметь префикс, используемый для создания архива.
- если у вас есть какие-либо проблемы, используйте
-Xlog:class+load
(подробнее о -Xlog
), чтобы получить больше информации
Ответ 2
В JEP для AppCDS показан пример, показывающий, как добавить классы приложений в общий архив. Что касается ограничений, их немного:
- Прямые классы (.class), присутствующие в каталоге по пути класса, не могут быть добавлены в общий архив. Смотрите эту тему.
- Классы, загруженные пользовательскими загрузчиками классов, не могут быть добавлены в общий архив. Смотрите эту тему.
Есть и другие практические соображения, которые следует учитывать при использовании CDS/AppCDS, таких как:
- Если вы обновите файлы jar в файловой системе, вам придется воссоздать общий архив.
- Если вы используете Java или JVMTI-агент (агенты), которые изменяют/повторно трансформируют/переопределяют файл класса во время выполнения, то общий архив не будет полезен, поскольку классы будут загружаться с диска, поскольку агенты нуждаются в фактических которые я считаю, не хранятся в общем архиве.
Другая приятная и подробная статья о CDS и AppCDS - https://simonis.github.io/cl4cds/.
Автор статьи также написал инструмент, который позволяет использовать классы приложений, даже если они загружаются пользовательскими загрузчиками классов.
Если вы заинтересованы в использовании CDS, вы также можете попробовать OpenJ9 JVM, который имеет эту функцию в течение длительного времени и намного более зрелым и полным. Подробнее об этом читайте здесь.