Модель памяти JVM

Java JVM алгоритм переводчик

Обзор JVM

  JVM = загрузчик классов + механизм выполнения + область данных времени выполнения


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

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


Регистр счетчика программ

  • приватная ветка,Его жизненный цикл такой же, как у нити.
  • Можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком.
  • В концептуальной модели виртуальной машины (только концептуальная модель, различные виртуальные машины могут быть реализованы более эффективными способами) интерпретатор байт-кода работает, изменяя значение этого счетчика, чтобы выбрать следующий элемент для выполнения Инструкции байт-кода, такие как : ветвь, цикл, переход, обработка исключений, возобновление потока (Многопоточное переключение) и другие основные функции.
  • Если поток выполняет метод Java, этот счетчик записывает адрес выполняемой инструкции байт-кода виртуальной машины; если поток выполняет метод Natvie, значение счетчика пусто (не определено).
  • Размер места, занимаемого данными, хранящимися в программном счетчике, не изменится при выполнении программы, поэтому OutOfMemoryError в этой области не будет.

Стеки JVM

  • приватная ветка,Его жизненный цикл такой же, как у нити.
  • Стек виртуальной машины описывает модель памяти выполнения методов Java.: метод создается одновременно с выполнением каждого методаРамка стекаОн используется для хранения такой информации, как таблица локальных переменных, стек операций, динамическая ссылка, выход из метода и т. д.Процесс каждого вызываемого метода до завершения выполнения соответствует процессу помещения кадра стека в стек в стеке виртуальной машины.
  • таблица локальных переменныхХранит различные базовые типы данных (boolean, byte, char, short, int, float, long, double) и ссылки на объекты (ссылочные типы), известные во время компиляции. Он не эквивалентен самому объекту. Согласно различным реализациям виртуальных машин, Это может быть ссылочный указатель на начальный адрес объекта или он может указывать на дескриптор, представляющий объект или другое местоположение, связанное с объектом) и тип returnAddress (указывающий на адрес инструкции байт-кода).Объем памяти, требуемый таблицей локальных переменных, выделяется во время компиляции.При входе в метод полностью определяется, сколько места локальной переменной метод должен выделить во фрейме, и размер таблицы локальных переменных не будет изменяться во время выполнения. выполнение метода.
  • Эта область может вызвать следующие исключения:
    1. Когда глубина стека, запрошенная потоком, превышает максимальное значение, он выбрасываетStackOverflowErrorаномальный;
    2. Если в стеке не может быть выделено достаточно памяти во время динамического расширения, будет выдано исключение OutOfMemoryError.

Стеки нативных методов

  • Очень похоже на стек виртуальной машины, разница в том, что стек виртуальной машины выполняет службы методов Java (то есть байт-кода) для виртуальной машины, в то время какСтек локальных методов обслуживает собственные методы, используемые виртуальной машиной.. Спецификация виртуальной машины не определяет язык, использование и структуру данных методов в собственном стеке методов, поэтому конкретная виртуальная машина может свободно реализовать ее. Даже некоторые виртуальные машины (например, виртуальная машина Sun HotSpot) напрямую объединяют собственный стек методов и стек виртуальной машины в один.
  • Как и стек виртуальной машины, область стека собственных методов также генерирует исключения StackOverflowError и OutOfMemoryError.

Куча Java (куча)

  • всемобмен потоками, созданный при запуске виртуальной машины, для хранения экземпляров объектов,Почти все экземпляры объектов выделяют здесь память.
  • Для большинства приложений куча Java (Java Heap) — это память, управляемая виртуальной машиной Java.максимумчасть.
  • Куча Java является основной областью, управляемой сборщиком мусора, и поэтому часто также называется "куча сборщика мусора". С точки зрения восстановления памяти, поскольку сборщики в основном используют алгоритм сбора поколений, куча Java также может быть подразделена на:Новое поколение и старое поколение; новое поколение состоит из трех частей: пространство Эдема, пространство «От выжившего» и пространство «К выжившему»..
  • Куча Java не требует непрерывной памяти и может динамически увеличивать свою память, вызывая исключение OutOfMemoryError, если увеличение не удается.

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

    • Он используется для хранения таких данных, как загруженная информация о классе, константы, статические переменные и код, скомпилированный компилятором реального времени.
    • Как и куча Java, она не требует непрерывной памяти и может динамически расширяться.Если динамическое расширение не удается, будет выдано исключение OutOfMemoryError.
    • Основная цель сбора мусора на этом участке –Постоянная переработка пула и выгрузка классов, но его вообще трудно реализовать.Виртуальная машина HotSpot расценивает его как постоянное поколение (Permanent Generation) для сборки мусора.
    • Область метода логически является частью кучи, но для того, чтобы отличить ее от кучи, ее обычно называют «не куча».

    Постоянный пул времени выполнения

    • Пул констант времени выполнения является частью области методов.
    • Константный пул в файле класса (различные литералы и символические ссылки, сгенерированные компилятором) будет помещен в эту область после загрузки класса.
    • В дополнение к константам, генерируемым во время компиляции, также допускается динамическая генерация, например, intern() класса String. Эти константы также помещаются в пул констант времени выполнения.


    Примечание:

    • До JDK1.7 HotSpot использовал постоянную генерацию для реализации области методов, HotSpot использовал генерацию GC для реализации области методов, что приносило большое удобство;
    • HotSpot удалил постоянное поколение, начиная с JDK1.7. Среди них ссылки на символы (Symbols) перемещаются в Native Heap, строковые константы и ссылки на классы перемещаются в Java Heap.
    • В JDK1.8 постоянное поколение полностью заменено метапространством (Meatspace). Суть метапространства аналогична постоянному поколению и представляет собой реализацию области методов в спецификации JVM. Но самая большая разница между метапространством и постоянной генерацией заключается в следующем:Метапространство находится не в виртуальной машине, а использует локальную память. Поэтому по умолчанию размер метапространства ограничен только локальной памятью.

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

    • Прямая память (Direct Memory) не является частью области данных среды выполнения виртуальной машины и не является областью памяти, определенной в спецификации виртуальной машины Java, но эта часть памяти также часто используется и может вызывать исключения OutOfMemoryError.
    • Класс NIO был недавно добавлен в JDK 1.4, представляя на основе канала и буфера В режиме ввода-вывода он может использовать собственную библиотеку функций для прямого выделения памяти вне кучи, а затем передавать DirectByteBuffer, хранящийся в куче Java. Объекты действуют как ссылки на эту часть памяти. Это может значительно повысить производительность в некоторых сценариях за счет предотвращения копирования данных между кучей Java и собственной кучей.

    Ссылка на ссылку:

    1. модель памяти JVM-1;
    2. модель памяти JVM-2;
    3. Структура кадра стека времени выполнения JVM;
    4. Переполнение стека виртуальной машины и собственного стека методов;
    5. раздел динамической памяти;
    6. Изучите кучу Java, область методов, стек Java и собственный стек методов из нескольких примеров;
    7. куча и штабель;
    8. Методическая зона и постоянный бассейн;