Введение
Содержание этой статьи
- Связь между памятью процесса и областью данных времени выполнения Java
- модель памяти Java (область данных времени выполнения)
- Моделирование выполнения программы
- Моделирование процесса создания объекта
- куча JVM
память процесса
процесс
Сначала коротко о самом процессе.
процесс(Процесс) — это работающее действие программы на компьютере с набором данных и основная единица распределения ресурсов и планирования в системе.
Программное обеспечение, установленное на нашем компьютере, такое как QQ, WeChat, 360 и т. д., запускается в операционной системе как процесс один за другим после запуска, и операционная система выделяет память компьютера для каждого процесса.
память процесса
Прикладываем лупу к памяти в процессе.По сути, каждый процесс делит память на несколько областей, которые грубо делятся на сегменты кода, сегменты стека и сегменты кучи.
Java-процесс
Наша Java-программа — это тоже процесс. Этот процесс загрузит, проанализирует файл класса, сохранит его в памяти и обработает. Расположение хранилища находится в куче процесса
Цель этой статьи — представить, как выглядит область данных среды выполнения.
область данных времени выполнения
Область данных времени выполнения разделена на область методов и стек виртуальной машины. Стек собственных методов. куча. счетчик команд. Следующие разделы вводятся по очереди.
область метода
Сфера действия:Область метода является общей для всех потоков.
эффект:Область метода используется для хранения загруженной информации о классе, констант, переменных и других данных.
Постоянное поколение и метапространство
Область метода — это «спецификация (понимаемая как интерфейс в программе)», заданная спецификацией виртуальной машины Java, а постоянное поколение и метапространство — это реализация области метода в разные периоды (метапространство после 1.8, постоянное поколение до) .
Помните модель класса, о которой мы говорили в Foundation 1 (класс — это отображение классов Java в C++). Объект класса в С++ фактически хранится в области метода (метапространство).
стек виртуальных машин
Виртуальный стек — это область, приватная для каждого потока.
Посмотрите на эту картинку и подумайте над вопросом: сколько существует виртуальных стеков? Ответ очевиден, потоков столько, сколько их существует.
структура
Взгляните еще раз на внутреннюю часть стека виртуальных машин.
Очень просто, на самом деле это стек. Стек должен иметь кадр стека.
Итак, что такое кадр стека здесь?
При выполнении каждого метода виртуальная машина Java будет синхронно создавать кадр стека.
Например:
public class Test {
public static void main(String[] args) {
add();
}
private static void add(){
}
}
Соответствующий виртуальный стек выглядит так.
Давайте проанализируем эту картину.
- После запуска программы сначала выполняется основной метод, а кадр стека основного метода создается в стеке виртуальной машины и помещается в стек. После вызова метода add в основном методе создайте кадр стека для добавления и поместите стек. Поэтому говорят, что main находится внизу, а add — вверху.
- Сколько существует кадров стека? После нашего анализа первого пункта легко сделать вывод, что существует столько кадров стека, сколько вызывается методов (обратите внимание, что методов не так много, потому что один и тот же метод может вызываться несколько раз).
Структура кадра стека
Кадр стека включает в себя: таблицу локальных переменных, стек операндов, динамическую ссылку, адрес возврата и другую информацию.
Стек операндов и таблица локальных переменных
Если вы посмотрите на этот пример, вы поймете (пожалуйста, прочитайте предыдущую статью, если вы не знакомы с байт-кодом)
public static void main(String[] args) {
int num = 1;
int num2 = 2;
int res = num + num2;
}
код операции
Смоделируем выполнение этой программы
- Содержимое таблицы локальных переменных в это время
Важно помнить порядок этих переменных.
- Константа 1 помещается в стек операндов.
- Извлеките верхний элемент стека и назначьте его второй переменной в таблице локальных переменных.
- Константа 1 помещается в стек операндов.
- Верхний элемент стека извлекается и присваивается третьей переменной таблицы локальных переменных.
6. Первый элемент типа int в таблице локальных переменных помещается в стек.
- Второй элемент типа int таблицы локальных переменных помещается в стек.
- Добавьте две переменные на вершину стека и поместите результат на вершину стека.
- Верхний элемент стека извлекается и присваивается четвертой переменной таблицы локальных переменных.
После прочтения этого примера я считаю, что у всех есть определенное представление о стеке операндов и таблице локальных переменных.Давайте посмотрим, что делается, когда объект новый.
новый объектный процесс
public static void main(String[] args) {
Test test = new Test();
}
код операции
Давайте объясним один за другим
- new #2 <com/haozi/Test>
Этот оператор делает две вещи
Первый пункт: выделить место в куче
Вторая часть: стек операндов, адрес, помещенный в это пространство.
Уведомление:В это время в куче применяется только место для этого объекта, а конструктор объекта не выполняется, то есть не инициализируется (для тех, кто не понимает процесс загрузки класса, обратитесь к Basic 3)
- dup
Скопируйте верхний элемент стека и поместите его на вершину стека
Зачем делать копию?
Поскольку элемент должен быть извлечен и назначен указателю this, если вы не скопируете копию указателя this и не назначите его, в стеке не будет адреса.
- invokespecial
выполнить конструктор
- astore_1
Назначить второму элементу таблицы локальных переменных
DCL и энергозависимая
Почему volatile добавляется к одноэлементным объектам в ленивом режиме? (не тема этой статьи)
Для повышения эффективности наш ЦП будет выполняться не по порядку.Третий и четвертый шаги предыдущего примера можно поменять местами, поэтому теоретически возможно получить объекты, которые не были инициализированы.
куча
размер по умолчанию
Минимум 1/64 физической памяти До 1/4 физической памяти
раздел кучи
Куча делится на старое поколение и новое поколение (соотношение 2:1), а новое поколение делится на область Эдема, область от и область до (соотношение 8:1:1).
Почему в старости так много места?
Резюме: Есть много вещей, которые нужно хранить в старости.
Подробно: (Не беда, если вы не поняли, мы поговорим о сборке мусора)
Старое поколение отвечает за хранение следующих объектов
- Два поколения для хранения объектов с gc больше 15
Из области в область туда-сюда 15 раз объект не был переработан и вошел в старость)
- Космическая гарантия для нового поколения
Когда gc встречается в новом поколении и не может быть записан, объект напрямую входит в старое поколение.
Пример:Объект занимает 20 мегабайт.После ygc он не восстанавливается.Область from всего 5 мегабайт.В это время он сразу входит в старость.
- Крупные объекты, объекты, превышающие 1/2 площади Эдема, сразу входят в старость