Неожиданно, вопросы о структуре памяти JVM могут быть такими сложными?

Java JVM

В моем блоге многие статьи уже знакомили со структурой памяти JVM, и я думаю, что многие друзья, читающие мои статьи, имеют определенное представление об этой части знаний.

Итак, попробуйте ответить на следующие вопросы:

1. Какова структура памяти, управляемая JVM?
2. Каковы различия между различными виртуальными машинами при реализации оперативной памяти?
3. Какие области области данных выполнения совместно используются потоками? Которые эксклюзивны?
4. Можно ли использовать какую-либо область, кроме памяти времени выполнения JVM?
5. В чем разница между кучей и стеком?
6. Массивы в Java хранятся в куче или в стеке?
7. Сколько существует способов создания объектов в Java?
8. Как происходит процесс создания объекта в Java?
9. Должны ли объекты в Java выделять память в куче?
10. Как получить дамп файлов кучи и стека?

Если вы можете точно ответить на все вышеперечисленные 10 вопросов, это означает, что вы действительно понимаете структуру памяти JVM и знания, связанные с распределением памяти.Если вы не понимаете каких-либо знаний, то эта статья может вам помочь.Часто задаваемые вопросы.

Какова структура памяти, управляемая JVM?

В процессе выполнения Java-программы виртуальная машина Java делит управляемую ею память на несколько разных областей данных. «Спецификация виртуальной машины Java» предусматривает, что память, управляемая JVM, должна включать следующие области времени выполнения:

Он в основном включает в себя регистр ПК (счетчик программ), стек виртуальной машины Java, собственный стек методов, кучу Java, область методов и постоянный пул времени выполнения.

Каждый регион играет свою собственную роль, и роль каждого региона не рассматривается в этой статье.

Однако следует отметить, что указанное выше разделение областей является лишь логической областью, а ограничения на некоторые области относительно свободны, поэтому разные производители виртуальных машин имеют разные реализации, даже разные версии одной и той же виртуальной машины.

Каковы различия между различными виртуальными машинами при реализации оперативной памяти?

Как упоминалось ранее, область памяти, необходимая для среды выполнения JVM, определенная «Спецификацией виртуальной машины Java», различается в разных реализациях виртуальных машин. этой части выглядит следующим образом:

Область методов создается при запуске виртуальной машины.Хотя область методов является логической частью кучи, простая реализация виртуальной машины может не реализовывать сборку мусора и сжатие в этой области. Эта версия спецификации также не ограничивает место в памяти области метода реализации и стратегию управления компиляцией кода. Емкость области метода может быть фиксированной, или она может динамически расширяться в соответствии с потребностями выполнения программы и уменьшаться, когда слишком много места не требуется. Область метода может не быть непрерывной в фактической пространственной станции памяти.

Можно сказать, что этот регламент дает производителям виртуальных машин большую свободу.

Спецификация виртуальной машины явно не требует расположения реализации области метода.В самой известной реализации виртуальной машины HotSopt (до Java 8) область метода является только логически независимой областью и не существует физически независимо от кучи. а в постоянном поколении. Таким образом, в это время область метода также может быть удалена сборщиком мусора.

Практика показала, что в JVM есть большое количество объектов, объявленных короткоживущими, и некоторые объекты с относительно долгим жизненным циклом. Чтобы принять для них разные стратегии сбора, используется алгоритм сбора поколений, поэтому виртуальная машина HotSpot делит кучу на новое поколение, старое поколение и постоянное поколение в соответствии с возрастом объекта.

В Java 8 виртуальная машина HotSpot удалила постоянное поколение и использовала локальную память для хранения информации о метаданных класса и назвала ее: Metaspace

Какие области области данных времени выполнения совместно используются потоками? Какие эксклюзивные?

В области памяти времени выполнения JVM регистры ПК, стеки виртуальных машин и стеки собственных методов используются исключительно потоками.

Куча Java и область методов совместно используются потоками. Но стоит отметить, что куча Java на самом деле не выделила отдельный кусок для каждого потока.TLAB-пространство, эта часть пространства используется исключительно потоками при выделении и совместно используется потоками при использовании.

Есть ли какая-либо доступная область, кроме памяти времени выполнения JVM?

В дополнение к области данных времени выполнения виртуальной машины, которую мы представили ранее, есть также часть памяти, которая часто используется.Это не часть области данных времени выполнения и не область памяти, определенная в спецификации виртуальной машины Java, есть - прямая память.

Выделение прямой памяти не ограничено размером кучи Java, но на него все равно будет влиять общий объем памяти сервера.

В NIO, представленном в JDK 1.4, вводится метод ввода-вывода, основанный на Channel и Buffer.Он может использовать функцию Native для прямого выделения памяти вне кучи, а затем использовать объект DirectByteBuffer, хранящийся в куче Java, в качестве памяти этого память приложение для работы.

В чем разница между кучей и стеком?

Куча и стек (стек виртуальной машины) — это две совершенно разные области памяти, одна из которых используется исключительно потоками, а другая совместно используется потоками.Самая большая разница между ними заключается в том, что хранимый контент отличается:

В куче в основном хранятся экземпляры объектов.
Стек (таблица локальных переменных) в основном хранит ссылки на различные базовые типы данных и объекты.

Массивы в Java хранятся в куче или в стеке?

В Java массив также является объектом, поэтому то, как объекты хранятся в памяти, применимо и к массивам;

Таким образом, экземпляры массивов хранятся в куче, а ссылки на массивы — в стеке.

Сколько существует способов создания объектов в Java?

Есть много способов создать объект в Java, самый простой способ — использовать ключевое слово new.

User user = new User();

В дополнение к этому объекты также могут быть созданы с использованием механизма отражения:

User user = User.class.newInstance();

Или используйте newInstance класса Constructor:

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();

Кроме того, вы также можете использовать метод клонирования и метод десериализации.Эти два метода используются редко и код более сложный, поэтому они не будут здесь показаны.Если вам интересно, вы можете узнать о них самостоятельно.

Каков процесс создания объекта в Java?

Общий процесс создания общего объекта Java выглядит следующим образом:

1. Виртуальная машина встречает новую инструкцию и находит символическую ссылку этого класса в пуле констант.
2. Проверьте, был ли загружен, разрешен и инициализирован класс, представленный символической ссылкой.
3. Виртуальная машина выделяет память для объекта.
4. Виртуальная машина инициализирует выделенное пространство памяти нулевым значением.
5. Виртуальная машина производит необходимые настройки объекта.
6. Выполните метод и инициализируйте переменные-члены.

Обязательно ли объекты в Java выделяют память в куче?

Как мы уже говорили ранее, экземпляры объектов в основном хранятся в куче Java, однако с развитием периода JIT-компиляции ианализ побегатехнологии созревают,выделение стека, метод оптимизации скалярной замены вызовет некоторые тонкие изменения, и все объекты размещаются в куче и постепенно становятся менее «абсолютными».

Фактически, во время компиляции JIT выполняет множество оптимизаций кода. Некоторые из этих оптимизаций направлены на снижение давления на выделение кучи памяти, а важный метод называется анализом побега.

Если JIT обнаружит, что некоторые объекты не имеют метода escape после анализа escape, возможно, что распределение памяти кучи будет оптимизировано для выделения памяти стека.

10. Как получить дамп файлов кучи и стека?

Java Dump — моментальный снимок виртуальной машины Java во время выполнения. Сохраните состояние и информацию о среде выполнения виртуальной машины Java в файл.

можно использовать на сервереjmapкоманда для получения дампа кучи, используйтеjstackКоманда для получения дампа стека вызовов потока.

Наконец, приглашаю всех обратить внимание на мой публичный аккаунт: