1. Одна команда соответствует одному процессу.
Когда мы запускаем программу Java, то есть когда мы запускаем основной метод, будет запущен процесс виртуальной машины Java, независимо от того, насколько сложен этот процесс. Различные процессы JVM не будут влиять друг на друга. Именно поэтому говорят, что Java-программа имеет только один вход — основной метод, который вызывается виртуальной машиной. Два основных метода соответствуют двум процессам JVM, запускающим два разных загрузчика классов и фактически работающим с разными классами. Поэтому они не будут влиять друг на друга.
2. Загрузка классов.
Когда мы используем класс, если класс не был загружен в память, система инициализирует класс посредством загрузки, подключения и инициализации.
1. Загрузка класса: относится к чтению файла класса в JVM и созданию для него объекта класса.
2. Соединение классов: относится к объединению двоичных данных класса в JRE, которое разделено на три этапа:
а) Проверка: проверьте правильность загруженных данных файла классов.
б). Подготовка: выделите место для хранения статических переменных класса и выполните инициализацию по умолчанию.
в) Синтаксический анализ: замените ссылки на символы в двоичных данных класса прямыми ссылками.
3. Инициализация. Инициализируйте статические переменные и статические блоки инициализации класса.
(Примечание. Для статического свойства конечного типа, если значение свойства было получено во время компиляции, вызов свойства не приведет к инициализации класса, поскольку это эквивалентно использованию константы;
Использование метода ClassLoader() только загружает класс, но не инициализирует его. )
3. Загрузчик классов.
Загрузчик классов отвечает за загрузку файлов .class в память и создание соответствующих объектов java.lang.Class. Он отвечает за загрузку всех классов. После загрузки класса в JVM он не будет загружен повторно.
В Java класс идентифицируется по полному имени класса (то есть имя пакета + имя класса).
В JVM класс идентифицируется по полному имени класса и загрузчику классов.
Когда JVM работает, будут созданы три ClassLoader, а именно: BootstrapClassLoader (загрузчик корневых классов), ExtClassLoader (расширенный загрузчик классов) и AppClassLoader (загрузчик системных классов). Структура UML выглядит следующим образом:
Среди них BootstrapClassLoader отвечает за загрузку базовой библиотеки классов JRE. Он не является подклассом ClassLoader и написан на C++, поэтому мы не можем увидеть его в Java. При получении с помощью метода getParent() его подкласса будет иметь значение null. быть возвращено. BootstrapClassLoader отвечает за загрузку основных библиотек классов Java, таких как rt.jar и charsets.jar, в цель JRE.
Как видно из рисунка, ExtClassLoader и AppClassLoader являются подклассами ClassLoader. Их нельзя увидеть в API, они находятся в файле rt.jar. Полные имена классов:
sun.misc.Launcher$ExtClassLoader и sun.misc.Launcher$AppClassLoader.
Среди них ExtClassLoader отвечает за загрузку пакета JAR в каталог расширений JRE ext, а AppClassLoader отвечает за загрузку пакета класса по пути к классам.
Тест заключается в следующем:
Скопируйте код кода следующим образом:
пакет com.stopTalking.crazy;
общественный класс TestClassLoader {
public static void main(String[] args) {
//Получаем загрузчик классов текущего потока
Загрузчик ClassLoader = Thread.currentThread().getContextClassLoader();
//Получаем загрузчик класса System
ClassLoader loader1 = System.class.getClassLoader();
//Получаем загрузчик классов loader2 этого класса TestClassLoader
ClassLoader loader2 = TestClassLoader.class.getClassLoader();
//Получаем родительский класс loader2
ClassLoader loader3 = loader2.getParent();
//Получаем родительский класс родительского класса loader2
ClassLoader loader4 = loader3.getParent();
System.out.println(загрузчик);
System.out.println(загрузчик1);
System.out.println(загрузчик2);
System.out.println(загрузчик3);
System.out.println(loader4);
}
}
Вывод консоли:
Скопируйте код кода следующим образом:
//Загрузчик классов, полученный текущим классом потока, — AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
//Класс System загружается корневым загрузчиком и к нему нельзя получить доступ в Java, поэтому он имеет значение null
нулевой
//Загрузчиком этого класса, конечно, также является AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
нулевой