Что нужно загрузить JVM, - это двоичный поток, который может быть в форме файла .class или других форм. Если вы проектируете его в соответствии со стандартами загрузки, проблем не будет.
Следующее в основном анализирует два вопроса механизма и стандартов:
Во -первых, давайте возьмем механизм загрузки файлов класса Java, который похож на механизм загрузки переменных. Сначала он загружает файл класса в память, затем проверяет, анализирует и инициализирует данные и, наконец, формирует тип Java, который виртуальная машина может использовать напрямую. Поскольку Java принимает механизм JIT, он будет медленно загружать, но ее преимущества очевидны, он обладает высокой гибкостью и поддерживает динамическую нагрузку и динамические соединения.
Далее, давайте поговорим о процессе загрузки класса:
Основной процесс загрузки класса находится в следующем порядке, но некоторые не являются строго в этом порядке, а некоторые находятся в неупорядоченном порядке. Например, динамическая нагрузка требует инициализации, а затем анализа.
1. Загрузка
Это зависит от виртуальной машины, но есть и случаи, когда вышеуказанная фаза выполняется, поскольку следует выполнять следующую фазу.
В настоящее время виртуальная машина делает три вещи:
Во -первых, прочитайте двоичный поток файла через полностью квалифицированное имя;
Во -вторых, поместите статические методы и переменные в файл в область метода;
В -третьих, создайте объект и положите его в кучу в качестве портала доступа.
Обратите внимание, что первым является прочитать двоичный поток, и он не говорит, из какого файла он читается или откуда он читается. Следовательно, это создает сильную масштабируемость в Java, которая может быть от JAR, ZIP или от сетевого уровня, уровня базы данных и т. Д.
Главным образом объявление объекта и области метода.
2. Проверка
Убедитесь, что бинарный поток соответствует требованиям виртуальной машины и не соответствует VerifyError.
Во -первых, проверка формата файла, есть ли волшебные числа, и соответствуют ли они требованиям файлов Java;
Во -вторых, проверка метаданных, независимо от того, соответствует ли она спецификациям кода Java, например, является ли абстрактный класс непосредственно созданным, есть ли у обычного класса косвенный объект или прямой родительский класс и т. Д.; В-третьих, проверка байт-кодов, анализирует поток данных и поток управления и гарантирует, что не будет никакого поведения, которое наносит вред виртуальной машине, например, вызовать несуществующие инструкции, следует ли назначать родительский класс на подкласс, назначать объект объекту этого типа и т. Д.;
В -четвертых, можно найти символическую ссылку, в основном, можно ли найти описание классов, переменных и метода, например, можно ли найти файл с полностью квалифицированным именем, независимо от того, доступно ли он и т. Д.
В основном определить внутреннюю структуру
3. Подготовьте
Присвоение начального значения переменной класса обычно является значением 0, таким как статическая переменная, не присваивая значение переменной экземпляра.
4. Анализ
Процесс преобразования символических ссылок в постоянный пул в прямые ссылки. Символическая ссылка, упомянутая здесь, относится к типу переменной, а прямое ссылка относится к ручке, которая может быть непосредственно расположена для объекта. Класс, метод, поле, анализ интерфейса, получение соответствующего объекта в соответствии с полностью квалифицированным именем и получить его тип. Если нет доступа к классу, не будет брошен нелегалакссеррор, не будет выброшен полевой nosuchfielderror, не будет выброшен ни один метод.
5. Инициализация
Загрузить классы и необходимые ресурсы в соответствии с требованиями программы. Есть только четыре ситуации, и вам нужно активно инициализировать, прежде чем вы сможете выполнить следующую операцию, поэтому сначала необходимо выполнить вышеуказанные четыре шага.
Во -первых, классы с новыми или статическими ключевыми словами, новые генерирует объекты и статические статические нагрузки, эти два, очевидно, будут инициализированы;
Во -вторых, если вы используете класс, вы ничего не можете с этим поделать;
В -третьих, методы в классе отражения должны быть инициализированы, верно?
В -четвертых, основной класс выполнения, класс, который использует основной метод. Другие ситуации пассивной инициализации не нужно учитывать.
Маленькие примеры:
Общедоступный класс SuperClass {static {System.out.println ("SuperClass !!");} public static int value = 1;} открытый подкласс Class Extens SuperClass {static {System.out.println ("subclass !!");}} public class -testclass upity void main (string) args);}} {System.out.println (subclass.value); Superclass superclass = new subclass ();}} superclass !! 1subclass !!Результат выполнения показывает проблему: когда подкласс вызывает переменную родительского класса, подкласс не инициализируется, потому что кодовое отношение в настоящее время не имеет ничего общего с подклассом; Когда подкласс инициализируется, родительский класс не инициализируется снова, потому что родительский класс был инициализирован в текущем теле метода. Единственная разница между интерфейсом и родительским классом заключается в том, что инициализация интерфейса не требует родительского интерфейса, и она будет инициализирована только тогда, когда будет использоваться родительский интерфейс, и будет генерируется тот же конструктор класса.
В настоящее время конструктор класса будет загружен, и все переменные в классе будут инициализированы. Конечно, родительский класс будет инициализирован перед детским классом.
6. Используйте
После загрузки, как это назвать, рисовать, расчет и т. Д.
7. удалить
Класс больше не называется
Будь то два класса равны в основном, зависит от первой загрузки с использованием одного и того же погрузчика, а второй полностью квалифицированный адрес имени одинаковы
Зачем задавать вышеуказанные вопросы? Далее мы поговорим о механизме загрузки виртуальной машины.
С точки зрения виртуальных машин Java, есть два погрузчика класса, один называется системным загрузчиком (загрузчик Bootstrap ClassLoader), а другой называется пользовательским загрузчиком (Extends ClassLoader). Это делится на два, один называется прикладным загрузчиком, а другой называется загрузчиком класса расширения, который, как правило, дефолт на первое; и наше приложение загружается в основном приведенными выше трех погрузчиками. Отношения между этими тремя - это приложение> Расширение> Bootsrap. Материанизм родительского делегирования относится к комбинации двух пар. Дочерний загрузчик сначала вызывает метод родительского погрузчика, а целевой объект не найден перед использованием дочернего погрузчика.
Псевдокод выглядит следующим образом:
LoadClass (String name, Boolean Resolve) {class c = findloadedclass () if (c == null) {if (parent! = null) c = parent.loadclass (имя, false); c = findbootstrapclassornulJava выступает за то, что мы пишем логику нашего класса по вызову в Findclass, что поможет нам обычно использовать родительский механизм делегирования.
Уничтожить 1. Переписать класс нагрузки
Уничтожить 2. Используйте погрузчик потока, чтобы родительский загрузчик вызовал метод загрузчика ребенка
Разрушение 3. Обычно используемый метод для горячей нагрузки - настройка загрузчика класса и перезаписать исходный модуль ошибок - OSGI
Однако, если правила между пользовательскими погрузчиками запутались, и существует проблема с ссылкой друг на друга одновременно, класс в конечном итоге не будет найдена, а тупик потока и утечки памяти произойдут.
Что касается горячего ремонта, также известного как плагины, наиболее популярными являются Hotfix, Nuwa, Droidfix, Fix и т. Д. Эти рамки можно найти на Github или в другом месте. Принципы, как указано выше, методы разнообразны, есть охват, перенаправление и т. Д., Посредством конфигурации, настройки действий и т. Д.; В качестве плагинов необходимо выполнить следующие условия:
1. Может быть установлен независимо, но не может быть запущен независимо
2. быть обратной совместимостью, можно расширить
3. Он может работать только в хост -программе и может быть отключен или заменен
Приведенный выше пример объяснения механизма загрузки виртуальной машины Java - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.