Серия JVM (1) — общий обзор JVM

Java задняя часть Архитектура JVM

предисловие

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

  • виртуальная машина на основе стека: самые популярные компьютерные архитектуры, такие как IntelX86архитектура и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следующее:

отношение загрузчика классов

  1. Bootstrap ClassloaderвJavaИнициализируется после запуска виртуальной машины.

  2. Bootstrap Classloaderответственный за погрузкуExtClassLoader, и воляExtClassLoaderРодительский загрузчик настроен наBootstrap Classloader

  3. 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загружается с использованиемМеханизм родительского делегирования,использоватьМеханизм родительского делегированияПри загрузке класса выполняются следующие шаги:

  1. ТекущийClassLoaderВо-первых, запросите, был ли этот класс загружен из класса, который был загружен сам по себе.Если он был загружен, он напрямую вернет исходно загруженный класс.

  2. ТекущийClassLoaderКогда загруженный класс не найден в кеше, загрузчик родительского класса поручается загрузить его.Загрузчик родительского класса использует ту же стратегию, сначала проверяет свой собственный кеш, а затем поручает загрузку родительскому классу родительского класса, пока вBootstrap ClassLoader.

  3. Когда все загрузчики родительского класса не загружены, он загружается текущим загрузчиком класса и помещается в свой собственный кеш, чтобы он мог вернуться непосредственно, когда в следующий раз будет запрос на загрузку.

резюме: Основная идея механизма родительского делегирования разделена на два этапа. Во-первых, проверьте, загружался ли класс снизу вверх; во-вторых, попробуйте загрузить класс сверху вниз.

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

image

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.