Предисловие
Область памяти Java в основном состоит из счетчиков программ, стеков виртуальных машин Java, локальных стеков методов, кучи Java, областей методов и постоянных пулов времени выполнения. Эта статья подробно расскажет вам о разделении и исключениях областей памяти Java. Я не скажу многое ниже, давайте посмотрим на подробное введение вместе.
Область данных времени выполнения
Когда JVM запускает программы Java, он делит память на несколько различных областей данных.
Программная счетчик
Тема рядовой. Его можно рассматривать как индикатор номера строки байт -кода, выполненный текущим потоком. Работа интерпретатора Bytecode состоит в том, чтобы прочитать следующую инструкцию по байт -коду, которая будет выполнена путем изменения этого значения счета.
Многопользовательский состав достигается путем переключения потоков по очереди и распределения времени выполнения процессора. В любой момент ядро может выполнять только инструкции в одном потоке. Чтобы вернуться в правильную позицию выполнения после переключения потока, каждый поток нуждается в независимом счетчике программы. Это то, что я упомянул в начале «Тема частного». Если метод, который выполняет поток, является методом Java, счетчик записывает адрес инструкции Bytecode виртуальной машины; Если это собственный метод, значение счетчика пусто. Счетчик программы является единственной областью, в которой в спецификации виртуальной машины не указана никакая ситуация OOM (OutofmemoryError).
Java Virtual Machine Stack
Потоки являются частными, с тем же жизненным циклом, что и потоки. Стек виртуальных машин Java описывает модель памяти методов Java: каждый метод создаст кадр стека при выполнении, хранит локальные таблицы переменных, стеки операндов, динамические ссылки и информацию о выходе из методов. Из вызова к концу каждый метод соответствует процессу записи стека и выхода этой кадры стека в стеке виртуальных машин. Таблица локальной переменной сохраняет различные основные типы данных (int, двойной, чар, байт и т. Д.), Справочник объекта (не сам объект) и тип returnaddress (указывая на адрес байт -кода).
Два возможных исключения в этой области:
Локальный стек методов
Приведенный выше стек виртуальных машин выполняет службы метода Java для JVM, а локальный метод выполняет нативную службу. Другие похожи на стек виртуальных машин, а Stackoverflowerror и OutofmemoryError также будут брошены.
Java Heap
Обычно называемые «памятью стека» и «память кучи», первое относится к стеку виртуальных машин, а последняя относится к куче Java. Куча Java разделяется потоками. Создан, когда начинается виртуальная машина.
Роль кучи Java заключается в хранении экземпляров объектов. Куча Java может находиться в физически прерывистых пространствах памяти и требует лишь логически непрерывной.
Метод зона
Область, разделенная нитью. Хранят данные, такие как информация класса, константы, статические переменные, код, составленный компилятором и т. Д., Которые были загружены виртуальной машиной. Когда область метода не может соответствовать требованиям распределения памяти, бросается OutofmemoryError.
Постоянный бассейн выполнения
Постоянный бассейн выполнения является частью области метода. C используется для хранения различных буквальных констант и символических ссылок, полученных в течение периода компиляции, и будут храниться в постоянном пуле выполнения, который входит в область метода после загрузки класса. Язык Java не требует, чтобы константы генерировались только в период компиляции. Другими словами, новые константы могут быть помещены в период пробега.
Прямая память
Прямая память не является частью области данных виртуальной машины, и это не область памяти. Распределение прямой памяти на собственной машине не будет ограничено размером кучи Java, но в конце концов это память. Если сумма каждой области памяти превышает предел физической памяти, все равно будет появляться OutofmemoryError.
Процесс создания объекта
Виртуальная машина встречается с «новой» инструкцией:
Макет памяти объектов
Схема объектов, хранящихся в памяти, можно разделить на 3 области:
Заголовок объекта: хранит собственные данные о времени выполнения объекта, такие как хэш -код, возраст генерации GC, флаг состояния блокировки, блокировку, удерживаемые потоками, идентификатором склонного потока и т. Д. Другая часть - указатель типа, то есть указатель на метаданные класса объекта. Виртуальная машина использует этот указатель, чтобы определить, к какому экземпляру класса принадлежит объект.
Данные экземпляра: действительно действительная информация объекта, содержание различных типов поля, определенного в программе;
Приложение выравнивания: несущественное, роль жильцов.
Позиционирование доступа к объекту
Программы Java управляют объектами экземпляра в куче посредством ссылок в стеке. например
Человек p = новый человек ();
Здесь P - это ссылка, а объект человека, созданный New, является экземпляром.
В этой ссылке не указывается, как найти и получить доступ к конкретному местоположению объектов в куче. Есть два основных метода доступа:
ручка. Кусок памяти будет разделена на кучу Java в виде пула ручки, который ссылается на адрес рукоятки объекта, а дескриптор содержит данные экземпляра объекта и данные типа. Преимущество заключается в том, что когда объект перемещается, вам нужно только изменить адрес в ручке, и сама ссылка не должна быть изменена.
Прямой указатель. Адрес объекта напрямую хранится в ссылке. Преимущество состоит в том, что скорость быстрее, и поскольку ссылка непосредственно представляет адрес объекта экземпляра, сохраняется операция позиционирования указателя. Именно так используется Sun Hotspot.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.