почему у jvm много класлоадеров?почему не один? - PullRequest
13 голосов
/ 08 марта 2012

Я учу ClassLoader на Java, затем я хочу знать, почему в JVM много загрузчиков классов, а не только один? Первая загрузка <Java_Runtime_Home>/lib, затем загрузка <Java_Runtime_Home>/lib/ext и последняя загрузка classpath.

Если у вас есть пользовательский загрузчик классов, система будет первой.

Кто-нибудь может сказать мне, почему у JVM много загрузчиков классов?

Ответы [ 4 ]

21 голосов
/ 08 марта 2012

Одним из очень полезных приложений является возможность развертывания нескольких веб-приложений на одном сервере Java EE.

Каждое приложение может использовать разные версии одних и тех же библиотек и поэтому должно иметь загрузчик классов, отличный от других, чтобы иметь возможность иметь разные версии одних и тех же классов в одной JVM.

6 голосов
/ 08 марта 2012

Существует несколько причин для поддержки более чем одного загрузчика классов.

Первое: разделение классов. Представьте себе сервер приложений. Несколько независимых проектов могут включать в себя одни и те же библиотеки. Если у каждого приложения есть собственный загрузчик классов, они могут загружать разные версии без коллизий, и для каждого загрузчика классов создаются статические поля AFAIK.

Второе: загрузчики классов могут быть перезаписаны для изменения классов. Загрузчик классов может улучшать классы во время загрузки. Полезно для аспектно-ориентированного программирования (AspectJ) или для добавления кода отладки или профилирования. Простой способ изменить только одну библиотеку, но не другую, - загрузить ее через разные загрузчики классов.

5 голосов
/ 08 марта 2012

enter image description here Загрузчики классов являются иерархическими и используют модель делегирования при загрузке класса.Загрузчики классов запрашивают у своего родителя загрузку класса, прежде чем пытаться загрузить его самостоятельно.Когда загрузчик классов загружает класс, загрузчики дочерних классов в иерархии никогда не будут перезагружать класс снова.Следовательно, уникальность сохраняется.Классы, загруженные дочерним загрузчиком классов, имеют видимость классов, загруженных его родителями вверх по иерархии, но обратное неверно, как объяснено на приведенной выше диаграмме.

4 голосов
/ 08 марта 2012

Позволяет запускать несколько приложений в одной JVM.

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

Возможно, эта информация о OSGi окажется полезной http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html

...