Подробное объяснение структуры памяти Java
Я считаю, что большинство Javaers имеют определенное представление о структуре памяти Java, но если структура памяти Java остается только в «куче», «стека» явно недостаточно. Сегодня я подробно расскажу вам о структуре области памяти Java, эта статья основана наJDK7Объясняется структура памяти JDK8.Структура памяти JDK8 добавлена с метапространством, и есть некоторые изменения.Студенты, которые хотят узнать больше об этом, пожалуйста, прочтите соответствующую информацию самостоятельно.
Структура статьи
- Схема структуры памяти
- Объясните подробно по каждой области схемы структуры памяти
1. Схема структуры памяти
иллюстрировать
- Область методов, область кучи (отмечена зеленым цветом) — это области памяти, совместно используемые всеми потоками, стек виртуальной машины, локальный стек методов и счетчик программ (отмечены синим цветом) — это области памяти, которые, по-видимому, имеют потоки. то есть изоляция потоков.
2. Подробное объяснение каждой области
счетчик команд
Код выполняется по порядку, но когда ЦП переключается между несколькими потоками, при переключении с потока А на поток В и обратно на поток А, как ЦП узнает, где продолжить выполнение из потока А? Когда ЦП работает, он основан на каждом потокесчетчик командЗначение выбирается для выбора следующей инструкции кода абзаца, которую необходимо выполнить, т. е. «найти позицию, которую он покидает, чтобы продолжить». Следует указать, что при выполнении ЦП программный счетчик записывает адрес выполняемой инструкции кода символа виртуальной машины. Если выполняется метод Native, значение этого счетчика не определено, то есть он не работает.
стек виртуальных машин
Стек виртуальной машины описывает модель памяти выполнения методов Java: каждый метод создаеткадр стекаИспользуется для хранения таблицы локальных переменных, стека операндов, динамической ссылки, выхода метода и другой информации. Процесс от вызова до завершения выполнения каждого метода соответствует процессу помещения и извлечения фрейма стека в стек виртуальной машины и из него.
В таблице локальных переменных хранятся различные типы переменных, размер которых может быть известен во время компиляции.Он был выделен во время компиляцииПри вызове метода виртуальная машина стекает в кадр стека, во время работы размер таблицы локальных переменных не меняется.
собственный стек методов
Функции локального стека методов и блокировки стека виртуальной машины очень похожи, разница между ними заключается в том, что стек виртуальной машины выполняет методы Java для виртуальной машины, а локальный стек методов служит виртуальной машине для выполнения собственных методов. Следует отметить, что, поскольку спецификация виртуальной машины не предписывает конкретную реализацию стека собственных методов, Sun HotSpot напрямую объединяет стек собственных методов и стек виртуальной машины в один.
куча Java
Куча Java — это область, на которой Javaer должен сосредоточиться, поскольку она включает в себя выделение памяти (новое ключевое слово, отражение и т. д.) и повторное использование (алгоритмы повторного использования, сборщики и т. д.). Позже будет время для публикации в блоге. Описание в Спецификации виртуальной машины Java: Все экземпляры объектов и массивы должны размещаться в куче. Важно отметить, что в куче Java, совместно используемой потоками, могут быть выделены несколько буферов выделения для отдельных потоков (TLAB). Это необходимо для проблем с грязным выделением памяти при одновременном выделении памяти. Его необходимо включить с соответствующими параметрами. использует CAS по умолчанию. Плюс механизм повторной попытки при сбое для решения проблемы грязного распределения). Кроме того, реализация кучи Java в HotSpot расширяема. Параметры -Xmx/-Xms для управления.
Область метода (постоянная генерация)
Область метода используется для хранения данных, таких как информация о классе, которая была загружена виртуальными машинами, константами, «ZDY», «123» и т. Д.), Статические переменные (стеновые переменные) и тому подобное. Область метода имеет уникальное имя, поскольку команда дизайна Hotspot расширяет GC к области метода, поэтому сборщик мусора горячих доступа может управлять этой частью памяти, такую как Hava Management Java и может сэкономить деньги. Написать работу кода управления памятью для области метода. Для других виртуальных машин (J9), это не постоянное поколение.
Параметры конфигурации постоянного поколения: -XX:MaxPermSize
постоянный пул времени выполнения
Пул констант времени выполнения является частью области методов и используется для хранения различных литералов ("zdy", "123" и т. д.) и символических ссылок, сгенерированных во время компиляции. Пул констант времени выполнения является динамическим.Не только содержимое файла класса может входить в пул констант времени выполнения, но и новые константы могут быть помещены в пул во время выполнения. Например, метод String.intern().
добавить --прямая память
Прямая память не является областью памяти спецификации Java Virtual Machine. Но эта часть также часто используется Javaer и также вызывает исключение OutOfMember. Так вот кстати.
NIO, добавленный в JDK4, использует библиотеку собственных функций для прямого выделения памяти вне кучи, а затем указывает на этот адрес для работы через буфер, кэшированный в куче Java. Это позволяет избежать копирования данных между кучей Java и собственной кучей, что может значительно повысить производительность в некоторых сценариях.
Прямая память не контролируется никакими параметрами виртуальной машины, но, очевидно, вы не можете превышать размер физической памяти.
Эпилог
Модель памяти JDK7 была примерно представлена. Блог серии JVM предоставит вам более подробный контент позже. Следующее уведомление:JVM-серия фактического исключения переполнения боевой памяти