Как использовать функцию общего доступа к данным в классе Java 10? - PullRequest
0 голосов
/ 01 июня 2018

Я читал о 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 или есть какие-то ограничения?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

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

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

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

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

Еще одна приятная и подробная статьяна CDS и AppCDS - https://simonis.github.io/cl4cds/.

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

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

0 голосов
/ 01 июня 2018

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

  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) для получения дополнительной информации
...