Общая структура JVM

задняя часть JVM

Виртуальная машина Java в основном отвечает за автоматическое управление памятью, загрузку и выполнение классов, в основном включая механизм выполнения, сборщик мусора, регистр ПК, область методов, область кучи, прямую память, стек виртуальной машины Java, локальный стек методов и подсистему загрузки классов. часть, в которой область методов и область кучи Java совместно используются всеми потоками, стек виртуальной машины Java, локальный стек методов и поток регистров ПК являются частными Структура макроса показана на следующем рисунке:

Структурная схема JVM

JVM基本结构.png

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

Информация о классе загружается из файла или сети, информация о типе хранится в области метода, включая загрузку классаЗагрузка -> Проверка -> Подготовка -> Анализ -> Инициализация -> Использование -> УдалениеНесколько этапов, подробный процесс будет представлен в последующих статьях.类加载流程.png

  • нагрузка

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

  • соединять

соединение делится наПроверьте, готовить, разбираться3 этапа, этап проверки обеспечивает правильность загрузки класса, этап подготовки выделяет память для статических переменных класса и инициализирует их значениями по умолчанию, а этап синтаксического анализа преобразует символические ссылки в классе в прямые ссылки

  • инициализация

Фаза инициализации отвечает за инициализацию класса.В Java есть два способа инициализации переменных класса.Начальное значение указывается при объявлении переменной класса, а статический блок кода определяет инициализацию.Только при активном использовании класса будет инициализация класса будет запущена.Инициализация класса сначала инициализирует родительский класс, а затем инициализирует дочерний класс.

  • использовать

Интерфейс для доступа класса к структуре данных в области методов, объект — это данные в области кучи.

  • удалить

Программа выполняет System.exit(), программа завершается нормально, процесс JVM завершается аварийно и т. д.

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

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

структура данных кадра стека

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

динамическая ссылка

Во время выполнения метода в Java кадр стека сохраняет символическую ссылку на метод, которая преобразуется в символическую ссылку посредством динамической компоновки.

управление памятью

  • Разделение памяти (логически)

Область памяти Java логически разделена на область кучи и область без кучи.До Java8 область без кучи также называлась постоянной областью.После Java8 она была объединена как исходная область данных.Область кучи делится на новое поколение и старое поколение в соответствии с моделью поколения.Новое поколение делится на Эдем, так и s1.Так и s1 две области одинакового размера.Производственная среда может настроить параметры соотношения распределения памяти виртуальной машины по конкретным сценариям для достижения эффекта настройки производительности.

Область кучи — это самая большая область памяти, управляемая JVM. Она совместно используется всеми потоками и использует модель поколений. Область кучи в основном используется для хранения экземпляров объектов. Куча может быть физически прерывистым пространством, но может быть логически Размер памяти кучи может быть указан параметрами виртуальной машины -Xmx и -Xms, когда куча не может продолжать расширяться, будет выдано исключение OOM.

  • экземпляр среды выполнения

Предполагая, что существует следующий тестовый класс SimpleHeap, отношение отображения, соответствующее области кучи, стеку Java и области методов SimpleHeap в памяти, показано на следующем рисунке:

public class SimpleHeap {
    /**
     * 实例变量
     */
    private int id;

    /**
     * 构造器
     *
     * @param id
     */
    public SimpleHeap(int id) {
        this.id = id;
    }

    /**
     * 实例方法
     */
    private void displayId() {
        System.out.println("id:" + id);
    }

    public static void main(String[]args){
        SimpleHeap heap1=new SimpleHeap(1);
        SimpleHeap heap2=new SimpleHeap(2);
        heap1.displayId();
        heap2.displayId();
    }

}

堆、栈、方法区关系.pngТочно так же конструкция класса человека, затем создает экземпляр объекта, область памяти, стек метода Java, область метода заключается в следующем:

прямая память

Библиотека Java NIO позволяет Java-программам использовать прямую память.Прямая память — это область памяти, независимая от области кучи Java.Скорость доступа к памяти лучше, чем у области кучи.Из соображений производительности, для сценариев с частым чтением и записью , прямой памятью можно управлять напрямую, ее размер не ограничен параметром Xmx, но сумма памяти кучи и прямой памяти должна быть меньше системной памяти.

регистр ПК

Личное пространство потока, также известное как счетчик программ, в любое время, поток Java всегда выполняет метод, выполняемый метод, мы называем его: «текущий метод», если текущий метод не является локальным методом, регистр ПК указывает на текущий метод, который в данный момент выполняется Инструкция, которая должна быть выполнена, если текущий метод является собственным методом, значение регистра ПК не определено.

система сбора мусора

Система сборки мусора является важной частью виртуальной машины Java. Она в основном перерабатывает область методов, область кучи и непосредственное пространство памяти. В отличие от C/C++, высвобождение пространства всех объектов в Java выполняется неявно, среди которых сборка мусора Управление памятью выполняется автоматически в соответствии с алгоритмом GC.