Pull to refresh

Comments 29

Базовые классы Java (rt.jar) загружаются при старте приложения. Классы расширений ($JAVA_HOME/lib/ext), также загружаются при старте.

Это неправда. Не думаете же Вы в самом деле, что все 6800+ классов из rt.jar загружаются сразу же при старте?
Системные классы также загружаются по мере необходимости. В случаях, когда используется Class Data Sharing (-Xshare:on), некоторые классы (перечисленные в jre/lib/classlist) могут быть предзагружены путем отображения (mmap) файла classes.jsa в виртуальную память.
Согласен. Сейчас напишу более корректно ;)
Этим загрузчиком загружаются классы из меременной CLASSPATH

Надо написать, что загрузчик грузит классы указанные в переменной CLASSPATH. Сами то классы хранятся не в переменной :)
Тогда классы, путь к которым указан в переменной CLASSPATH
Тогда уж «грузит классы, указанные в переменной...». И ещё вместо «указанные» написал бы «перечисленные».
Спс, за замечания ;) Кое-что исправил.
Может, стоит упомянуть:
1. Когда загружется класс
2. Что происходит при загрузке (про инициализацию статиков и т.п.)
3. Как работает память, в которой лежат загруженные классы
Во-во. Честно говоря, статья получилась ни о чем.
Ни про URLClassLoader или зачем вообще нужны пользовательские загрузчики, ни про выгрузку классов, ни про взаимоотношения class loading / class linking / class initialization, ни про Class Data Sharing.
Ну, разве что в следующей статье, которая обещана быть интересней…
Про вользовательские загрузчики я обещал написать в другой статье. Про ворядок загрузки Вы уже второй просите написать, так что пожалуй добавлю.
вользовательские -> пользовательские.

Пользуйтесь spell checker'ом, что ли…
Ну видно же, что очепятка — зачем ругаешься, начальника?
Кстати, при загрузке никакой инициализации статиков не происходит — это уже потом, в процессе инициализации класса.
1) Это я писал.
2) Добавлю в пост.
3) Это уже другая тема ;)
Автор, вы являетесь членом Санкт-Петербургской группы тестирования JVM? Если нет, то в статье явно не хватает ссылки на оригинал
Заключение просто порвало моск.
Context Classloader — загрузчик контекста текущего потока. Получить и установить данный загрузчик можно с помощью методов Thread.getContextClassLoader()/Thread.serContextClassLoader(). Загрузчик контекста устанавливается автоматически для каждого нового потока. При этом, используется загрузчик родительского потока.


Исправьте ошибку:
serContextClassLoader -> setContextClassLoader
спасибо, интересная статья. я только не понял, почему после не обнаружения класса в кэше по всей иерархии загрузчиков, дальше попытка его найти начинается с конца иерархии? Логичнее было бы начинать с корня, т.е. с системного загрузчика.
Кажется, я вас не понял. Но попытаюсь пояснить. У каждого загрузчика свой кеш. Поиск осуществляется вверх по иерархии. Если поиск завершился неудачей, начинается загрузка. Загрузка — наоборот, осуществляется вниз по иерархии.
смотрите, поиск в кеше идет от Системного загрузчика к пользовательскому. Загрузка идет почему-то от пользовательского к системному — почему?
Все наоборот. Откуда вы это взяли?
ну вот же написано:

Рассмотрим процесс загрузки более детально. Пусть в систем исполнения встретилась декларация переменной пользовательского класс Student.

1) Системный загрузчик попытается поискать в кеше класс Student.
_1.1) Если класс найден, загрузка окончена.
_1.2) Если класс не найден, загрузка делегируется загрузчику расширений.
2) Загрузчик расширений попытается поискать в кеше класс Student.
_2.1) Если класс найден, загрузка окончена.
_2.2) Если класс не найден, загрузка делегируется базовому загрузчику.
3) Базовый загрузчик попытается поискать в кеше класс Student.
_3.1) Если класс найден, загрузка окончена.
_3.2) Если класс не найден, базовый загрузчик попытается его загрузить.
__3.2.1) Если загрузка прошла успешно, она закончена ;)
__3.2.2) Иначе управление предается загрузчику раширений.
_3.3) Загрузчик расширений пытается загрузить класс.
__3.3.1) Если загрузка прошла успешно, она закончена ;)
__3.3.2) Иначе управление предается системному загрузчику.
_3.4) Системный загрузчик пытается загрузить класс.
__3.4.1) Если загрузка прошла успешно, она закончена ;)
__3.4.2) Иначе генерируется исключение java.lang.ClassNotFoundException.
прошу прощения, я перепутал базовый и системный загрузчики. Названия у них уж больно похожие.
Рад, что вы разобрались.
Вот еще интересная презентация. В основном в ней рассказывается про то, как реализована загрузка классов в OSGi, но и базовые моменты рассматриваются.
Sign up to leave a comment.

Articles