Подтвердить что ты не робот

Можно ли динамически загружать и выгружать jdk и настраиваемые модули в Java 9?

Я начинаю в JPMS и не могу понять его динамизм. Например, в текущем экземпляре JVM moduleA.jar выполняется. moduleA требуется только модуль java.base. Теперь я хочу

  • для динамического загрузки moduleB.jar, которому нужен модуль java.sql и moduleC.jar
  • выполнить код из moduleB
  • выгрузить moduleB, java.sql, moduleC из JVM и освободить все ресурсы.

Можно ли это сделать в модульной системе Java 9?

4b9b3361

Ответ 1

Это расширенная тема. На высоком уровне модульная система не динамична в том смысле, что отдельные модули нельзя выгружать или заменять в запущенной виртуальной машине. Однако вы можете использовать API, в частности java.lang.module.Configuration и java.lang.ModuleLayer, для создания динамических конфигураций модулей и создания экземпляров в рабочей VM в качестве слоя модулей. В вашем сценарии вы можете создать слой модулей с модулями B и C. Этот уровень модулей будет GC'ed/unloaded, если нет ссылок на них.

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

Ответ 2

Другой ответ полностью правильный, но обратите внимание, что "в конце" эти вещи не изменились.

Перед Java 9 вы можете использовать пользовательские экземпляры загрузчика классов для достижения чего-то подобного. Это, например, то, как серверы приложений, такие как Tomcat, позволяют повторно развернуть приложение - в основном, отбрасывая весь "контекст", который изначально был "построен" с использованием конкретного экземпляра загрузчика класса.

С Java9 эта концепция описывается с использованием абстракции слоев, но в конце она все же означает, что пользовательский код должен обеспечивать всю реализацию фактически создающих слоев разными загрузчиками классов.

И для некоторого дальнейшего чтения слоев см. этот ответ, который я дал некоторое время назад по аналогичному вопросу (в котором основное внимание было уделено использованию разных версий одного и того же модуля в рамках одного приложения).