Сборник технических вопросов и ответов (15) Модель памяти JVM

Java задняя часть JVM переводчик

1 Структура композиции JVM?

JVM组成结构

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

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

JVM运行时数据区域

3 Что такое счетчик программы?

  1. Номер линии Индикатор Bytecode выполняется текущей нитью;
  2. Thread private, жизненный цикл такой же, как и у thread;
  3. В концептуальной модели виртуальной машины интерпретатор байт-кода работает какВыберите следующую инструкцию байт-кода для выполнения, изменив значение этого счетчика., такие как: ветвление, цикл, переход, обработка исключений, восстановление потока (многопоточное переключение) и другие базовые функции;
  4. Если поток выполняет метод Java, этот счетчик записывает адрес выполняемой инструкции байт-кода виртуальной машины;Если выполняется метод Natvie, значение счетчика пусто (не определено);
  5. Размер места, занимаемого данными, хранящимися в программном счетчике, не изменится при выполнении программы.Так что OutOfMemoryError в этой области не будет;

4 Что такое стек виртуальной машины?

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

5 Что такое собственный стек методов?

  1. Обслуживайте собственный метод, используемый виртуальной машиной;
  2. Thread private, жизненный цикл такой же, как и у thread;
  3. Спецификация виртуальной машины не определяет язык, использование и структуру данных методов в собственном стеке методов, поэтому конкретная виртуальная машина может свободно реализовать ее. Даже некоторые виртуальные машины (например, виртуальная машина Sun HotSpot) напрямую объединяют локальный стек методов и стек виртуальной машины в один;
  4. Как и стек виртуальной машины, локальная область стека методов также генерирует исключения StackOverflowError и OutOfMemoryError;

6 Что такое куча?

  1. Создается, когда виртуальная машина начинает хранить экземпляры объектов, здесь выделяется память почти для всех экземпляров объектов;
  2. общий для всех потоков;
  3. Куча Java — это основная область, управляемая сборщиком мусора, поэтому ее часто называют «кучей сборщика мусора». С точки зрения восстановления памяти, поскольку сборщики в основномАлгоритм сбора поколений принят, поэтому кучу Java также можно разделить на:Новое поколение и старое поколение; новое поколение состоит из трех частей: пространство Эдема, пространство «От выжившего» и пространство «К выжившему».;
  4. Куча Java не требует непрерывной памяти и может быть динамически увеличена за счет увеличения ее памяти.OutOfMemoryErrorаномальный;

JVM堆参数示意

7 Что такое область метода?

  1. для храненияЗагруженная информация о классе, константы, статические переменные, код, скомпилированный JIT-компилятороми другие данные;
  2. общий для всех потоков;
  3. Главной целью сбора мусора в этом районе являетсяПереработка пула констант и выгрузка классов, но обычно более труднодостижимо,Виртуальная машина HotSpot рассматривает его как постоянное поколение (Permanent Generation) для сборки мусора.;
  4. а такжеКуча Java не требует непрерывной памяти и может динамически расширяться., если динамическое расширение не удастся, будет выброшеноOutOfMemoryErrorаномальный;

8 Что такое постоянный пул времени выполнения?

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

До JDK1.7, HotSpot использует постоянную генерацию для реализации области методов, HotSpot использует генерацию GC для реализации области методов, что обеспечивает большое удобство;

HotSpot удалил постоянное поколение, начиная с JDK1.7.. Среди них символы перемещаются в Native Heap, а строковые константы и ссылки на классы перемещаются в Java Heap.

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

9 Что такое прямая память?

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