Аннотация: Первоисточник https://peijie-sh.github.io Добро пожаловать на перепечатку, сохраняйте аннотацию, спасибо!
В JVM память в основном делится на 5 категорий
кучаHeap
- Самый большой кусок памяти в управлении памятью виртуальной машины.
- хранить ключевые слова
new
Созданы экземпляры объектов и массивы. - Память кучи совместно используется всеми потоками.
- Эта область памяти
JVM
(Виртуальная машина Java) управляет собой. При использовании new для создания объекта не обязательно указывать размер выделенного пространства,JVM
Область будет динамически и автоматически выделена; во время выполнения программы, когда нет ссылки на этот объект, объект помечается как пригодный для повторного использования и будет утилизированGC
(сборщик мусора) автоматически восстанавливает в неопределенное время, чтобы освободить занятое пространство памяти. - С точки зрения восстановления памяти, большинство сборщиков мусора основаны на алгоритмах сборки поколений, поэтому куча обычно делится на
新生代
и老年代
, которые можно разделить на:Eden空间
,From Survivor空间
,To Survivor空间
.
стек виртуальных машинVM Stack
- Содержит 8 примитивных типов данных и ссылок на объекты (не объекты).
- Каждый поток имеет свой отдельный стек.
- Первый пришел, последний вышел, последний пришел первым вышел.
- Поскольку он в основном хранит переменные данных базового типа, выделение пространства происходит быстрее, чем куча. Когда область действия переменной превышена, пространство будет немедленно освобождено компилятором.
собственный стек методовNative Method Stack
- и
虚拟机栈
похожий,虚拟机栈
Вызовите службы методов Java для виртуальной машины,本地方法栈
Вызовите службу собственного метода для виртуальной машины. - В реализации виртуальной машины HotSpot
虚拟机栈
и本地方法栈
объединены в одну область.
счетчик командProgram Counter Register
Небольшой объем памяти, который можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком.
Выберите следующую инструкцию байт-кода для выполнения, изменив значение счетчика. Основные функции (ветвь, цикл, переход, обработка исключений, восстановление потока и т. д.) зависят от его выполнения.
Функции:
- Частный поток: поскольку многопоточность виртуальной машины Java достигается за счет переключения потоков и распределения времени выполнения процессора, в определенное время будет выполняться только один поток. Следовательно, каждый поток должен иметь независимый программный счетчик, чтобы вернуться к правильной позиции выполнения после переключения потока.
- Отсутствие переполнения памяти: если поток выполняет метод Java, этот счетчик записывает адрес выполняемой инструкции байт-кода виртуальной машины; если поток выполняет собственный метод, значение счетчика пусто (не определено). Эта область памяти является единственной областью, в которой не указаны какие-либо условия OutOfMemoryError в Спецификации программы виртуальной машины Java.
область методаMethod Area
- Как и куча, она используется всеми потоками.
- Это логическая область памяти, используемая для хранения таких данных, как информация о классе, константы, статические переменные и код, скомпилированный компилятором JIT, который был загружен виртуальной машиной.
постоянный пул времени выполненияRuntime Constant Pool
- часть области метода.
- В дополнение к информации описания версии класса, поля, метода, интерфейса и т. д. в файле класса также существует постоянный пул, который используется для хранения различных литералов и символьных ссылок, сгенерированных во время компиляции.Эта часть содержимого будет загружен после загрузки класса и хранится в пуле констант времени выполнения в области методов.
прямая памятьDirect Memory
Прямая память не является частью области данных времени выполнения виртуальной машины и не является областью памяти, определенной в спецификации виртуальной машины Java. Но эта часть памяти также часто используется, и это также может вызвать исключение OutOfMemoryError.
В JDK 1.4 был недавно добавлен класс NIO (новый ввод/вывод), который представил Буферный режим ввода-вывода, который может использовать собственную библиотеку функций для непосредственного выделения памяти вне кучи, а затем передавать хранилище Объекты DirectByteBuffer в куче Java работают как ссылки на эту память. Это может быть заметно в некоторых сценариях Повышает производительность, поскольку исключается копирование данных между кучей Java и собственной кучей.