Ядром платформы Java является виртуальная машина Java. Это компонент технологии, который отвечает за независимость системы от конкретного оборудования и операционных систем, небольшой размер скомпилированного кода и его способность защищать пользователей от вирусов и других вредоносных программ.

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

JVM является частью JRE (среда выполнения Java). Виртуальная машина Java распознает только определенный двоичный формат, формат файла класса, и не понимает язык программирования Java. Файл класса включает в себя таблицу символов, инструкции виртуальной машины Java (или байт-коды) и другую вспомогательную информацию.

Приложения Java называются WORA (Write Once Run Anywhere). Это предполагает, что программист может написать код Java в одной системе и ожидать, что он будет правильно выполняться на любой другой машине, поддерживающей Java. Приложения Java запускаются с использованием JVM в качестве механизма выполнения.

Внутри виртуальной машины Java

Любой язык программирования требует определенной среды со всеми необходимыми компонентами, интерфейсами программирования приложений и компиляторами для создания, компиляции, тестирования и запуска своих приложений. Исходные коды Java преобразуются во время компиляции в процесс, известный как байт-код. используйте встроенный в JDK компилятор Java (javac). Этот байт-код имеет строки кода операции и операнда и отформатирован в шестнадцатеричном формате. Эти инструкции могут быть интерпретированы JVM на родном машинном языке, который может понять ОС и базовая аппаратная платформа.

Подсистема загрузки классов

Оперативная память предназначена для JVM. Подсистема загрузчика классов используется для загрузки файлов классов в оперативную память во время работы JVM. это называется функцией «динамической загрузки классов» в Java.

Загрузка

Основная задача загрузчика классов — загрузить скомпилированные классы (.class) в память. Следующие попытки загрузки класса выполняются в соответствии со ссылками на классы в активных классах, как указано в следующих случаях:

байт-код делает статическую ссылку на класс — Employee.sign

байт-код создает объект класса — Employee employee = new Employee()

Связывание

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

Инициализация

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

Область данных времени выполнения

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

Область методов

Все потоки JVM имеют доступ к одной и той же области методов, поэтому динамическое связывание и доступ к данным в области методов должны быть потокобезопасными. Это общий ресурс, но «только 1 область методов на JVM».

Область кучи

Область кучи служит местом хранения всей информации об объекте, а также переменных экземпляра и массивов, которые сопровождают каждый объект. Данные, хранящиеся в разделах Method и Heap, не являются потокобезопасными, поскольку они совместно используют память с несколькими потоками. Это область также является общим ресурсом, но «только 1 область метода на JVM».

Область стека

Когда поток начинает хранить вызовы методов, создается отдельный стек среды выполнения. Это не общий ресурс. Относительно каждого потока JVM. Для каждого такого вызова метода будет создана и добавлена ​​(продвинута) в начало стека среды выполнения одна запись; эта запись известна как кадр стека.

Регистры ПК

Для хранения адреса выполняемой в данный момент инструкции генерируется отдельный регистр счетчика программ, когда поток первоначально начинается относительно каждого потока JVM. Адрес следующей инструкции изменяется в регистре ПК после завершения выполнения.

Стек собственных методов

Поток Java и собственный поток операционной системы имеют прямое сопоставление. Также создается отдельный собственный стек для хранения информации о собственных методах после установления всего состояния для потока Java. Метод run() в потоке Java вызывается после того, как собственный поток установлен и инициализирован.

Исполнительный механизм

Execution Engine выполняет инструкции в байт-коде построчно, считывая данные, назначенные вышеуказанным областям данных времени выполнения. Именно здесь фактически выполняется байт-код.

Переводчик

Инструкции выполняются по одной интерпретатором, интерпретирующим байт-код. Он может быстро интерпретировать одну строку байт-кода, но выполнение вывода занимает больше времени.

Точный компилятор (JIT)

он компилирует весь байт-код в собственный код (машинный код). Затем он напрямую предоставляет собственный код для повторных вызовов методов, и выполнение собственного кода происходит значительно быстрее, чем интерпретация инструкций по одной. Нативный код хранится в кеше, поэтому скомпилированный код может выполняться быстрее.

Сборщик мусора

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