Рубрики
Без рубрики

Существует целый ряд других более технических тем, которые я изучил на этой неделе, в том числе; Как создавать объекты и создавать экземпляры объектов в Java, управляющие состоянием с помощью массивов геттеров и сеттеров > Литералы массивов, многомерные массивы и списки массивов Java Списки и карты Строки на самом деле являются объектами IntelliJ становится менее страшным, чем больше я улавливаю… Наконец-то я все это выяснил! потерять его… я на следующей неделе. Архитектура JVM

Существует целый ряд других более технических тем, которые я изучил на этой неделе, в том числе; Как создавать объекты и создавать экземпляры объектов в Java, управляющие состоянием с помощью массивов геттеров и сеттеров > Литералы массивов, многомерные массивы и списки массивов Java Списки и карты Строки на самом деле являются объектами IntelliJ становится менее страшным, чем больше я улавливаю… Наконец-то я все это выяснил! потерять его… я на следующей неделе. Байт-код JVM будет выполняться JRE. архитектура Существует целый ряд других более технических тем, которые я изучил на этой неделе, в том числе; Как создавать объекты и создавать экземпляры объектов в Java, управляющие состоянием с помощью массивов геттеров и сеттеров > Литералы массивов, многомерные массивы и списки массивов Java Списки и карты Строки на самом деле являются объектами IntelliJ становится менее страшным, чем больше я улавливаю… Наконец-то я все это выяснил! потерять его… я на следующей неделе. JVM JRE – это реализация JVM, которая анал

Существует целый ряд других более технических тем, которые я изучил на этой неделе, в том числе; Как создавать объекты и создавать экземпляры объектов в Java, управляющие состоянием с помощью массивов геттеров и сеттеров > Литералы массивов, многомерные массивы и списки массивов Java Списки и карты Строки на самом деле являются объектами IntelliJ становится менее страшным, чем больше я улавливаю… Наконец-то я все это выяснил! потерять его… я на следующей неделе. JVM JRE – это реализация JVM, которая анализирует байт-код, байт-код будет выполняться JRE. Архитектура JVM с тегами java, jvm, jre. в… байт-код будет выполнен JRE. архитектура Существует целый ряд других более технических тем, которые я изучил на этой неделе, в том числе; Как создавать объекты и создавать экземпляры объектов в Java, управляющие состоянием с помощью массивов геттеров и сеттеров > Литералы массивов, многомерные массивы и списки массивов Java Списки и карты Строки на самом деле являются объектами IntelliJ становится менее страшным, чем больше я улавливаю… Наконец-то я все это выяснил! потерять его… я на следующей неделе. JVM JRE – это реализация JVM, которая анализирует байт-код, JAR – это реализация JVM, которая анализирует байт-код, интерпретирует код и выполняет его. Байт-код будет выполнен JRE. Архитектура JVM с тегами java, jvm, jre. в… байт-код будет выполнен JRE. архитектура JVM – Виртуальная машина – это программная реализация физической машины. Java была разработана с использованием концепции WORA, которая работает на виртуальной машине. Компилятор компилирует файл Java в файл Java .class, затем этот файл .class вводится в JVM, которая загружает и выполняет файл класса. Ниже приведена архитектура JVM:

JVM разделена на 3 основные подсистемы:  Подсистема загрузчика классов  Область данных во время выполнения  Механизм выполнения

  1. Подсистема загрузчика классов – функция динамической загрузки классов Java обрабатывается подсистемой загрузчика классов. Он загружается, связывается. и инициализирует файл класса, когда он ссылается на класс в первый раз во время выполнения, а не во время компиляции. Он проверяет файлы классов с помощью верификатора байт-кода. Файл класса будет загружен только в том случае, если он действителен. 1.1 Загрузка – Классы будут загружены этим компонентом. Ниже приведены различные загрузчики классов, которые помогут в этом, и они следуют алгоритму иерархии делегирования при загрузке файлов классов. • Загрузчик классов начальной загрузки – Отвечает за загрузку классов из пути к классам начальной загрузки, ничего, кроме rt.jar . Этому загрузчику будет отдан наивысший приоритет. • |/Загрузчик классов расширения – Отвечает за загрузку классов, находящихся внутри папки ext (jre\lib) • Загрузчик классов приложений – Отвечает за загрузку Пути к классу уровня приложения, пути, указанной переменной среды и т.д. 1.2 Связывание – Ниже приведены различные компоненты в разделе Связывание • Проверить – Верификатор байт-кода проверит, является ли сгенерированный байт-код правильным или нет, если проверка завершится неудачей, мы получим сообщение об ошибке. • Подготовить – Для всех статических переменных будет выделена память, которой будут присвоены значения по умолчанию. • Разрешить – Все ссылки на символическую память заменяются исходными ссылками из области методов. 1.3 Инициализация – Это заключительная фаза загрузки классов; здесь всем статическим переменным будут присвоены исходные значения, и статический блок будет выполнен. Области данных во время выполнения

  2. – Область данных времени выполнения разделена на 5 основных компонентов:

2.1 Область метода – Область метода также называется областью класса. Область методов хранит данные для каждого класса, такие как поля, пулы констант, а также данные и информацию о методах. Здесь будут храниться все данные уровня класса, включая статические переменные. На JVM есть только одна область методов, и это общий ресурс. 2.2 Площадь Кучи – Все объекты и соответствующие им переменные экземпляра и массивы будут храниться здесь. На JVM есть только одна область кучи, и это общий ресурс. Поскольку области метода и кучи совместно используют память для нескольких потоков, хранимые данные не являются потокобезопасными. 2.3 Площадь штабеля – Для каждого потока будет создан отдельный стек времени выполнения. Для каждого вызова метода в памяти стека будет сделана одна запись, которая называется кадром стека. Все локальные переменные, все параметры и все адреса возврата будут созданы в памяти стека. Стек никогда не хранит объекты, но они хранят ссылки на объекты. Область стека потокобезопасна, поскольку она не является общим ресурсом. Фрейм стека разделен на три дочерних объекта: • Массив локальных переменных – Зависит от метода, сколько задействовано локальных переменных и соответствующие значения будут храниться здесь. • Стек операндов – Если требуется выполнить какую-либо промежуточную операцию, стек операндов действует как рабочее пространство среды выполнения для выполнения операции. • Данные кадра – Здесь хранятся все символы, соответствующие методу. В случае любого исключения информация о блоке catch будет сохранена в данных кадра. 2.4 Счетчик программ (ПК) Регистры – Каждый поток будет иметь отдельные регистры ПК для хранения адреса текущей исполняемой инструкции. Как только инструкция будет выполнена, регистр ПК будет обновлен следующей инструкцией. 2.5 Стеки собственных методов – Стек собственных методов содержит информацию о собственных методах. Для каждого потока будет создан отдельный собственный стек методов. Собственные внутренние потоки содержат всю информацию, относящуюся к собственным платформам. Например, если мы запускаем JVM в Windows, она будет содержать информацию, связанную с Windows. Аналогично, если мы работаем на Linux, в нем будет вся необходимая нам информация, связанная с Linux.

  1. Механизм выполнения – Байт-код, назначенный Области данных среды выполнения, будет выполняться Механизмом выполнения. Механизм выполнения считывает байт-код и выполняет его по частям. 3.1 Интерпретатор – Интерпретатор интерпретирует байт-код быстрее, но выполняется медленно. Недостатком интерпретатора является то, что когда один метод вызывается несколько раз, каждый раз требуется новая интерпретация. 3.2 JIT-компилятор – Компилятор JIT компилирует байт-код в машинный код во время выполнения и повышает производительность приложений Java. Таким образом, JIT-компилятор нейтрализует недостатки интерпретатора. Механизм выполнения будет использовать помощь интерпретатора для преобразования байт-кода, но когда он находит повторяющийся код, он использует компилятор JIT, который компилирует весь байт-код и изменяет его на собственный код. Этот собственный код будет использоваться непосредственно для повторных вызовов методов, которые повышают производительность системы. Конечно, JIT-компиляция требует процессорного времени и использования памяти. При первом запуске JVM вызывается множество методов. Компиляция всех этих методов может существенно повлиять на время запуска, хотя в конечном итоге программа может достичь хорошей производительности. Методы не компилируются при первом вызове. Для каждого метода JVM поддерживает счетчик вызовов, который увеличивается при каждом вызове метода. Методы интерпретируются JVM до тех пор, пока количество вызовов не превысит порог компиляции JIT (порог компиляции JIT повышает производительность и помогает JVM быстро запускаться. Пороговое значение было тщательно выбрано разработчиками Java для обеспечения оптимальной производительности. Поддерживается баланс между временем запуска и долгосрочной производительностью). Поэтому очень часто используемые методы компилируются сразу после запуска JVM, а менее часто используемые методы компилируются позже. После компиляции метода его количество вызовов сбрасывается до нуля, а последующие вызовы метода увеличивают его количество вызовов. Когда количество вызовов метода достигает порога перекомпиляции JIT, компилятор JIT компилирует метод во второй раз, применяя больше оптимизаций по сравнению с оптимизациями, примененными в предыдущей компиляции. Этот процесс повторяется до тех пор, пока не будет достигнут максимальный уровень оптимизации. Наиболее часто используемые методы всегда оптимизированы для максимального повышения производительности при использовании JIT-компилятора.

Допустим, JIT-компиляция. После компиляции метода его количество вызовов сбрасывается до нуля, а последующие вызовы метода увеличивают его количество вызовов. Когда количество вызовов метода достигает 2 (т.е. порог перекомпиляции JIT), компилятор JIT компилирует метод во второй раз, применяя больше оптимизаций.

Ниже приведены подкомпоненты, включенные в состав JIT-компилятора: • Генератор промежуточного кода – Создает промежуточный код • Оптимизатор кода – отвечает за оптимизацию промежуточного кода, сгенерированного выше. • Генератор целевого кода – Отвечает за генерацию машинного кода или собственного кода • Профилировщик – специальный компонент, отвечающий за поиск горячих точек, т.е. независимо от того, вызывается ли метод несколько раз или нет. 3.3 Сборщик мусора – Сборка мусора – это процесс, посредством которого JVM очищает объекты (неиспользуемые объекты) из кучи, чтобы освободить место в куче. Собирает и удаляет объекты, на которые нет ссылок. Сборка мусора может быть запущена вызовом System.gc(), но выполнение не гарантируется. Сборка мусора JVM собирает созданные объекты.

  1. Java Native Interface (JNI) – JNI будет взаимодействовать с библиотеками собственных методов и предоставляет собственные библиотеки, необходимые для механизма выполнения.

  2. Библиотеки собственных методов – Это набор собственных библиотек, необходимых для механизма выполнения.

Наиболее важными компонентами JVM, связанными с производительностью, являются: Куча, компилятор JIT (Just In Time) и сборщик мусора.

Оригинал: “https://dev.to/veerugithubcode/jvm-architecture-4p0”