предисловие
JVM
даJava Virtual Machine
(виртуальная машина Java) аббревиатура,JVM
это вычислительное устройствоСпецификация,этомнимыйКомпьютер реализуется путем имитации различных компьютерных функций на реальном компьютере.
JVM маскирует информацию, относящуюся к конкретным платформам операционных систем.,сделатьJava
Программу нужно только сгенерировать вJava
на виртуальной машинеСкомпилируйте один раз, запустите много раз, кроссплатформенный.JVM
При выполнении байт-кода он фактически заканчиваетсябайт-кодинтерпретируется как зависящий от платформымашинные инструкциивоплощать в жизнь.
Java
Виртуальная машина включает в себя наборнабор инструкций байт-кода,Одна группарегистр,Одинкуча,Одинкуча сбора мусораиобласть метода хранения.
В этой статье будет кратко описано следующее:
текст
что такое JVM
Сравнение JDK, JRE и JVM
JVM
,JRE
,JDK
обаjava
Основа языка, они работают вместе. Но разница в томJdk
иJRE
реален, иJVM
Это абстрактное понятие, которого на самом деле не существует.
JDK
JDK
(Комплект разработки Java) ДаJava
комплекты для разработки языкового программного обеспечения (SDK
).JDK
физическое существование, даprogramming tools
,JRE
иJVM
коллекция .
JRE
JRE
(среда выполнения Java)Java
среда выполнения,JRE
присутствует физически, в основномJava API
иJVM
композиции, предусматривает выполнениеjava
применениесамый низкийнеобходимая среда.
JVM
JVM
это вычислительное устройствоСпецификация,этомнимыйПрограммная реализация компьютера, проще говоря,JVM
это работаетbyte code
Контейнер для программ байт-кода.
Особенности JVM
-
виртуальная машина на основе стека: самые популярные компьютерные архитектуры, такие как Intel
X86
архитектура иARM
Архитектура работает на основерегистр. Например, АндроидDavilk
виртуальная машина основана нарегистрструктура иJVM
Он основан на структуре стека. -
Символическая ссылка:Кромебазовый типданные кроме(классы и интерфейсы)на всем протяжениисимволссылаться, не используя явноадрес памятиЦитировать.
-
вывоз мусора: экземпляр класса используется пользовательской программойСоздайтеи сбор мусораавтоматическое уничтожение.
-
сетевой порядок байтов:
Java class
Файлы хранятся в сетевом порядке байт-кода, что обеспечивает обратный порядок байтов.Intel x86
Архитектура и прямой порядок байтовRISC
Независимость между архитектурами серии.
Байт-код JVM
JVM
Используя способ байт-кода Java, какJava
Язык пользователяимашинный языкпромежуточный язык между. реализоватьуниверсальный,независимый от машиныисполнительная площадка.
Что может JVM
Из соображений безопасности,JVM
запрос вclass
В файле используются обязательный синтаксис и ограничения, но любой язык может быть преобразован дляJVM
принято действительнымclass
документ. В качестве универсальной, машинно-независимой платформы исполнения разработчики любого другого языка могутJVM
как средство доставки его языковых продуктов.
JVM
Процесс выполнения следующий:
- код загрузки
- код верификации
- выполнить код
- Обеспечьте операционную среду
JVM
жизненный цикл
-
запускать: у кого есть
main
методclass
можно использовать какJVM
Начальная точка для запуска экземпляра. -
бегать:
main
Функция является отправной точкой, и другие потоки в программе запускаются ею, в том числеdaemon
поток демона иnon-daemon
нормальная нить.daemon
даJVM
собственный поток, напримерGC
нить,main
Начальный поток методаnon-daemon
. -
погибнуть: когда все потоки завершатся,
JVM
Экземпляр завершает свою жизнь.
JVM
Сочинение
JAVA
Процесс выполнения кода выглядит следующим образом:
1. Загрузчик классов
загрузчик классовОтвечает за загрузку типов (классов и интерфейсов) в программу и присвоение им уникальных имен для их идентификации.
JDK
По умолчанию предусмотрено триClassLoader
следующее:
отношение загрузчика классов
-
Bootstrap Classloader
вJava
Инициализируется после запуска виртуальной машины. -
Bootstrap Classloader
ответственный за погрузкуExtClassLoader
, и воляExtClassLoader
Родительский загрузчик настроен наBootstrap Classloader
-
Bootstrap Classloader
загруженExtClassLoader
, он загрузитсяAppClassLoader
, и воляAppClassLoader
Родительский загрузчик указан какExtClassLoader
.
Роль загрузчика классов
Class Loader | выполнить | ответственный за погрузку |
---|---|---|
Bootstrap Loader | C++ |
%JAVA_HOME%/jre/lib , %JAVA_HOME%/jre/classes и путь, указанный параметром -Xbootclasspath, и классы в |
Extension ClassLoader | Java |
%JAVA_HOME%/jre/lib/ext , все под дорожкуclasses каталог иjava.ext.dirs Библиотека классов по пути, указанному системной переменной |
Application ClassLoader | Java |
Classpath класс в указанном месте илиjar документация, она жеJava Загрузчик классов программы по умолчанию |
Механизм родительского делегирования
Java
серединаClassLoader
загружается с использованиемМеханизм родительского делегирования,использоватьМеханизм родительского делегированияПри загрузке класса выполняются следующие шаги:
-
Текущий
ClassLoader
Во-первых, запросите, был ли этот класс загружен из класса, который был загружен сам по себе.Если он был загружен, он напрямую вернет исходно загруженный класс. -
Текущий
ClassLoader
Когда загруженный класс не найден в кеше, загрузчик родительского класса поручается загрузить его.Загрузчик родительского класса использует ту же стратегию, сначала проверяет свой собственный кеш, а затем поручает загрузку родительскому классу родительского класса, пока вBootstrap ClassLoader
. -
Когда все загрузчики родительского класса не загружены, он загружается текущим загрузчиком класса и помещается в свой собственный кеш, чтобы он мог вернуться непосредственно, когда в следующий раз будет запрос на загрузку.
резюме: Основная идея механизма родительского делегирования разделена на два этапа. Во-первых, проверьте, загружался ли класс снизу вверх; во-вторых, попробуйте загрузить класс сверху вниз.
ClassLoader
Изолируйте проблему
каждыйзагрузчик классовесть один из своихПространства именИспользуется для сохранения загруженных классов. Когда загрузчик классов загружает класс, он используетглобально квалифицированное имя класса(Fully Qualified Class Name
), чтобы выполнить поиск, чтобы определить, был ли уже загружен класс.
JVM
иDalvik
Уникальная идентификация классаClassLoader id
+ PackageName
+ ClassName
, поэтому в работающей программе могут быть два класса с одинаковыми именами пакетов и классов. и если два «класса» не состоят изClassLoader
Загрузка — это пример класса, который не может бытьсильный поворотДля другого класса этоClassLoader
изолировать.
доверили родителидаClassLoader
Решение проблемы согласованности классов, а такжеAndroid
Основа дифференцированного развития и термического ремонта.
Особенности загрузчика классов
Java
при условиидинамическая нагрузкахарактеристика. Во время выполнения первая ссылка наclass
это будет выполнено, когдаЗагрузка, **Связывание** и **Инициализация** вместо времени компиляции. Различные JVM имеют разные реализации, и содержание, описанное в этой статье, ограниченоHotspot JVM
.
JVM
Загрузчик классов отвечает за динамическую загрузку,Java
Загрузчик классов имеет следующие характеристики:
-
Иерархия: загрузчики классов в Java организованы в иерархию родитель-потомок. Загрузчик классов Bootstrap — отец всех загрузчиков.
-
прокси-режим: в зависимости от иерархии прокси-серверы классов могут передаваться между загрузчиками. Когда загрузчик загружает класс, он сначала проверяет, был ли он загружен в родительском загрузчике. Если верхний загрузчик загрузил класс, класс будет использоваться напрямую. В противном случае загрузчик класса запросит загрузку класса
-
Ограничения видимости: дочерний загрузчик может искать классы в родительском загрузчике, но родительский загрузчик не может искать классы в дочернем загрузчике.
-
Удаление запрещено: загрузчик классов может загружать класс, но не выгружать его, но вы можете удалить текущий загрузчик классов и создать новый загрузчик классов для загрузки.
процесс загрузки классов
-
Загрузка
Во-первых, согласнополное имя классанайти класс, представляющий
Class
файл, а затем прочитать вбайтовый массивсередина. Затем байты анализируются, чтобы увидеть, представляют ли ониClass
объекти содержит правильныйmajor
,minor
Информация о версии.прямой родительский классТакже загружаются классы и интерфейсы. После завершения этих операцийобъект класса или интерфейсасоздается из двоичного представления. -
Связывание
Связывание — это процесс изучения класса или интерфейса и подготовки типа и родительского интерфейса. Процесс связывания состоит из трех шагов:Проверка,Подготовка,Необязательно разрешение.
- проверять
Это самый сложный процесс загрузки класса и занимает больше всего времени. Задача состоит в том, чтобы убедиться, что импортируемый типточность, проверки, выполненные на этапе проверки, не нужно выполнять во время выполнения. Хотя скорость загрузки снижается, множественные проверки избегаются.
- Подготовить
В процессе подготовки обычно выделяется структура дляИнформация о классе хранения, эта структура содержит классы, определенные вПеременные-члены,методиинформация об интерфейсеЖдать.
- Разобрать
Разбор является необязательным этапом, поместите этот класспостоянный пулВсеСимволическая ссылкаизменить напрямая цитата. В противном случае разрешение символа не произойдет, пока инструкция байт-кода не использует эту ссылку.
-
Инициализация
Инициализируйте переменные в классе соответствующими значениями. воплощать в жизньстатический инициализатор,Пучокстатическая переменнаяИнициализируется указанным значением.
JVM
Спецификация определяет несколько из вышеперечисленных задач, но допускает некоторую гибкость в реализации.
2. Исполнительный механизм
пройти череззагрузчик классовзагружен, назначенJVM
изобласть данных времени выполненияБайт-код будетисполнительный механизмвоплощать в жизнь.
исполнительный механизмотинструкциячитать в единицахJava
байт-код. это какCPU
то же самое, выполнять по одномумашинные инструкции. Каждая инструкция байт-кода состоит из 1-байтовойкод операциии дополнительныеоперандсочинение.исполнительный механизмполучить одинкод операции, то согласнооперандвыполнить задание, а затем перейти к следующему пункту после завершениякод операции.
ноJava
Байт-код написан на языке, понятном людям, а не на языке, который машины могут выполнять напрямую. следовательно,исполнительный механизмдолжен поставитьбайт-кодпреобразовано в может быть напрямуюJVM
язык исполнения.
байт-кодможно преобразовать двумя способамимашинный язык:
-
устный переводчик
устный переводчикчитать один за другимбайт-код,объяснятьивоплощать в жизньинструкции байт-кода. Поскольку он интерпретирует и выполняет инструкции одну за другой, он можетобъяснить быстробайт-код, нобудет медленнее выполняться. Это недостаток интерпретируемых языков. «Язык» байт-кода в основном интерпретируется и выполняется.
-
Компилятор Just-In-Time
Своевременный компиляторВведен для компенсации недостатков интерпретатора.исполнительный механизмСначала подпишитесьобъяснить выполнениеспособ выполнения, а затем, при необходимости,Своевременный компиляторПучоквесь байт-кодскомпилировано всобственный код. Тогда механизму выполнения не нужно интерпретировать метод выполнения, он может выполнять его напрямую через нативный код. Выполнение нативного кода намного быстрее, чем его интерпретация по отдельности. Скомпилированный код может выполняться очень быстро, потому что собственный код хранится в кеше.
Java
байт-кодобъяснить выполнение, но не непосредственно вJVM
Хост-исполнениесобственный кодбыстрый. Чтобы улучшить производительность,Oracle Hotspot
Виртуальная машина находит наиболее часто исполняемые фрагменты байт-кода и компилирует их в собственный машинный код. составленособственный машинный кодхранится впамять вне кучив кэше кода.
этим методом(JIT)
,Hotspot
Виртуальная машина компенсирует следующие две затраты времени: дополнительное время, необходимое для компиляции байт-кода в машинный код, и дополнительное время, необходимое для интерпретации и выполнения байт-кода.
Вставьте здесь, что виртуальная машина ART, используемая после Android 5.0, использует механизм AOT.
Dalvik
зависит отJust-In-Time (JIT)
Компилятор интерпретирует байт-код. Скомпилированный разработчиком код приложения необходимо запускать на устройстве пользователя через интерпретатор, что неэффективно, но упрощает запуск приложения на другом оборудовании и архитектурах.ART
полностью изменил этот подход,Прекомпилировать байт-код в машинный язык во время установки приложения., этот механизм называетсяAhead-Of-Time (AOT)
компилировать. Удалив процесс интерпретации кода, приложение будет выполняться более эффективно и быстрее запускаться.
Ссылаться на
Чжоу Чжимин, Глубокое понимание виртуальной машины Java: расширенные функции и лучшие практики JVM, Machinery Industry Press
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.