Как программист, вы не можете обойти это во время собеседования.JVM
, Можно сказать, что это наша вечная боль. Вы чувствуете, что каждый раз, когда вы берете интервью, вы должны повторять его снова, иначе интервью будет жалким.
Затем приходит проблема,为什么每次面试都要背?``为什么背完过了断时间就忘了?
Помимо отсутствия глубокой памяти, есть еще одна важная причина непонимания и, конечно же, запоминания того, чего вы не понимаете.
Итак, начиная с этой статьи, мы должны начать изучать JVM и стремиться понять память и собрать воедино точки знаний. Хоть этот кусок знаний и очень нудный и нудный, я стараюсь писать просто и интересно Давайте потрудимся вместе, ладно?
Во-первых, механизм загрузки классов
1.1 Полный процесс (простая версия)
Как видно из приведенного выше рисунка, простой поток выполнения Java-программы выглядит следующим образом:
1. Пишем Java-код локально
2. Компилятор автоматически компилирует его в файл .class для нас (также через команду javacРучная компиляция, т.к. тут нам помогла идея, на самом деле нижний слой все равно вызывает команду javac)
3. Затем разверните веб-контейнер для запуска (вы также можете запустить его с помощью команды java -jar)
Этот процесс кажется очень простым, на самом деле он заключается в преобразовании исходных файлов Java в файлы .class, распознаваемые Java, а затем в пакетировании и запуске.
1.2 Полный процесс (сложная версия)
На самом деле весь жизненный цикл класса от второго шага (скомпилированного в .class файл) до третьего шага (выполнение) нельзя объяснить в одном-двух предложениях. Он включает в себя сложный и полный процесс :(是不是被骗了,一看下面的图,好复杂,头晕
🤣)
加载(Loading)
Этап очень простой, когда программа выполнится до нужного класса, JVM пройдет类加载器
Загрузите его в память. Далее давайте посмотрим, что есть类加载器
, а затем подробно объясните весь процесс загрузки класса.(稍后再来)
грузчик 2 класса
Группа разработчиков виртуальной машины Java реализует загрузку вне виртуальной машины Java, чтобы программа могла решить, когда получать требуемые классы. Код, который это делает, называется "загрузчиком классов".
以上简单来说,完成加载这个过程的代码叫做类加载器,其有应用程序自己决定。
类加载器
Делится на 3 категории:
-
Bootstrap ClassLoader (启动类加载器)
Он в основном отвечает за загрузку основных библиотек классов в каталоге установки JDK (например, классов в каталоге /lib), которые необходимы самой JVM при работе. -
Extension ClassLoader(扩展类加载器)
В основном отвечает за загрузку расширенных библиотек классов в каталоге установки JDK (например, классов в каталоге /lib/ext). -
Application ClassLoader(应用类加载器)
Отвечает за загрузку классов Java, разработанных самими пользователями.
Вышеупомянутые три загрузчика классов используются для загрузки разных классов, то есть класс может только有且只有一个
Загрузчик классов загружает его.
3 Механизм родительского делегирования
Итак, вопрос в том, как обеспечить загрузку только одного загрузчика классов?
Давайте сначала посмотрим на отношения между ними: (сначала загрузчик класса запуска является дедушкой, загрузчик класса расширения является отцом, а загрузчик класса приложения является сыном), за исключением того, что загрузчик класса запуска не имеет родителя, другие загрузчики классов У обоих есть родители.
官方说法
:
Если загрузчик классов收到
загрузка класса请求
, он первый不会自己
пытаться加载
этот класс, но поставить этот запрос委派
давать父类
загрузчик для завершения, это имеет место на каждом уровне загрузчика классов, поэтому все запросы загрузчика классов должны передаваться на верхний уровень启动类加载器
, только тогда, когда父级
Загрузчик классов возвращает себя无法完成
Это загружает запрос,子类
Загрузчик попытается完成加载
.
白话翻译下
:
Если запрос (зарплату) получает загрузчик класса приложения (сын), он должен не тратить ее сам, а отдать сначала своему родительскому загрузчику класса, то есть загрузчику класса расширения (папа), в это время он тоже Дон' t потратить его самостоятельно, а затем передать его родительскому загрузчику классов, который является стартовым загрузчиком классов (дедушка). Если дедушка говорит, что запрос не может быть загружен (то есть нет денег), то передайте его загрузчику класса расширения (папе), если папе нужны деньги, он может их потратить (то есть загрузить класс), если папа не нужно тратить деньги, сдай грузчику класса расширения (папа) Сын, пусть сын тратит деньги.
преимущество
4. Разрушьте модель родительского делегирования
Нам нужно знать, что механизм родительского делегирования — это не обязательная модель ограничений, а всего лишь реализация загрузчика классов, рекомендованная нам разработчиками Java.
Например, Tomcat не реализует модель родительского делегирования, давайте подумаем, почему он не реализует модель родительского делегирования? (двигает головой)
Tomcat — это веб-контейнер, ему нужно решить проблему изоляции версий. То есть веб-контейнеру может потребоваться развертывание нескольких приложений, а разные приложения могут зависеть от разных версий одной и той же сторонней библиотеки классов.Не может требоваться, чтобы на одном сервере существовала только одна копия одной и той же библиотеки классов. Поэтому , необходимо следить за тем, чтобы каждое приложение Библиотеки классов были независимыми и гарантированно изолированными друг от друга.
Его можно увидеть на рисунке:
Классы, которые CatalinaClassLoader и SharedClassLoader могут загружать, изолированы друг от друга.
WebAppClassLoader может использовать классы, загруженные SharedClassLoader, но отдельные экземпляры WebAppClassLoader изолированы друг от друга.
Очевидно, что механизм загрузки tomcat нарушает модель механизма родительского делегирования.Чтобы добиться изоляции, каждый webappClassLoader загружает файлы классов в свою директорию и не передает их загрузчику родительского класса, нарушая механизм родительского делегирования.
Во-вторых, процесс загрузки класса
2.1 Этап проверки
Проверьте конкретное содержимое, чтобы убедиться, что поток байтов файла класса соответствует всем требованиям спецификации виртуальной машины Java. Это включает в себя проверку различной информации, такой как формат файла, метаданные, байт-код, ссылки на символы и многое другое.
2.2 Подготовительный этап
2.3 Фаза анализа
2.4 Фаза инициализации
2.5 Фаза использования
2.6 Этап удаления
Эпилог
В этой статье в основном рассказывается о типах загрузчиков классов JVM, о том, как они используются вместе и почему они уничтожают загрузчики классов, а затем описывается полный процесс загрузки файла с несколькими примерами диаграмм в середине, которые ясно объясняют процесс. .
Если вы считаете, что сочинение в порядке, пожалуйста, поставьте лайк 👍, ваше одобрение является движущей силой для моего письма!
Если вы считаете, что что-то не так, пожалуйста, прокомментируйте. Вы также можете подписаться на мой общедоступный номер学习Java的小姐姐
, давайте обсудим это вместе.
Хорошо, пока.