`Опция непризнанной виртуальной машины» CMSClassUnloadingEnabled » после переключения на java 17

#java #gradle #jvm #jvm-arguments #java-17

#Ява #грейдер #спм #jvm-аргументы #ява-17

Вопрос:

После изменения версии Java на 17 я не могу создать проект Gradle.

Я использую версию Gradle 7.3.1, и в свойствах Gradle есть следующая строка:

 org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xms1g -Xmx4g -XX: UseG1GC -XX: CMSClassUnloadingEnabled  

затем я получил следующую ошибку

 Unrecognized VM option 'CMSClassUnloadingEnabled' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.  

Если я удалю -XX: CMSClassUnloadingEnabled , то получу эту ошибку:

 Unable to make field private int java.lang.reflect.Field.modifiers accessible: module java.base does not "opens java.lang.reflect" to unnamed module @1b9ee3e0  

Комментарии:

1. «Непризнанный параметр виртуальной машины «CMSClassUnloadingEnabled» возникает из-за того, что в Java 14 был удален сборщик мусора CMS, и параметры, относящиеся к этому сборщику мусора (например, «CMSClassUnloadingEnabled»), являются незаконными для Java 14 и более поздних версий. Если вы добавите эту опцию, JVM откажется запускаться.

2. Вторая ошибка «Не удалось сделать поле закрытым в java.lang.reflect. Поле.доступные модификаторы» происходит из-за того, что Java 17 резко ограничила доступ к внутренним полям. Однако, поскольку Gradle 7.3 совместим с Java 17, это должно быть сообщение об ошибке от какого-либо стороннего плагина или из вашего кода. Без дальнейшего контекста это не может быть решено.

3. Да, вы правы, это из-за аспектаj

4. Типичный случай эзотерических параметров командной строки. Этот параметр -XX: CMSClassUnloadingEnabled , как следует из названия, специфичен для сборщика мусора CMS и, следовательно , никогда не имел никакого смысла в сочетании с -XX: UseG1GC совершенно другим сборщиком мусора. Итак, теперь, когда сборщик CMS удален, параметры, связанные с CMS, вызывают ошибку, но эти параметры в любом случае не действовали, когда вы использовали G1GC. Поскольку G1GC используется по умолчанию в JDK 17, вы даже можете удалить эту -XX: UseG1GC опцию.