Комментарии 29
Базовые классы Java (rt.jar) загружаются при старте приложения. Классы расширений ($JAVA_HOME/lib/ext), также загружаются при старте.
Это неправда. Не думаете же Вы в самом деле, что все 6800+ классов из rt.jar загружаются сразу же при старте?
Системные классы также загружаются по мере необходимости. В случаях, когда используется Class Data Sharing (-Xshare:on), некоторые классы (перечисленные в jre/lib/classlist) могут быть предзагружены путем отображения (mmap) файла classes.jsa в виртуальную память.
Может, стоит упомянуть:
1. Когда загружется класс
2. Что происходит при загрузке (про инициализацию статиков и т.п.)
3. Как работает память, в которой лежат загруженные классы
1. Когда загружется класс
2. Что происходит при загрузке (про инициализацию статиков и т.п.)
3. Как работает память, в которой лежат загруженные классы
Во-во. Честно говоря, статья получилась ни о чем.
Ни про URLClassLoader или зачем вообще нужны пользовательские загрузчики, ни про выгрузку классов, ни про взаимоотношения class loading / class linking / class initialization, ни про Class Data Sharing.
Ну, разве что в следующей статье, которая обещана быть интересней…
Ни про URLClassLoader или зачем вообще нужны пользовательские загрузчики, ни про выгрузку классов, ни про взаимоотношения class loading / class linking / class initialization, ни про Class Data Sharing.
Ну, разве что в следующей статье, которая обещана быть интересней…
Кстати, при загрузке никакой инициализации статиков не происходит — это уже потом, в процессе инициализации класса.
1) Это я писал.
2) Добавлю в пост.
3) Это уже другая тема ;)
2) Добавлю в пост.
3) Это уже другая тема ;)
Эм… Не в ту ветку. Это к комментарию habrahabr.ru/blogs/java/103830/#comment_3232699
В свое время написал два блог-поста:
Конструирование объектов в Java
Пишем свой загрузчик Java-классов
Конструирование объектов в Java
Пишем свой загрузчик Java-классов
Автор, вы являетесь членом Санкт-Петербургской группы тестирования JVM? Если нет, то в статье явно не хватает ссылки на оригинал
Если вы про статью blogs.sun.com/vmrobot/entry/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%B2, то она не является оригиналом. Отуда взяты лишь картинки.
Заключение просто порвало моск.
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.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Загрузка классов в Java. Теория