Как стек JVM, куча и потоки отображаются в физической памяти или операционной системе

В книге компилятора (Книга драконов) объясняется, что типы значений создаются в стеке, а ссылочные типы создаются в куче.

Для Java JVM также содержит кучу и стек в области данных времени выполнения. Объекты и массивы создаются в куче, кадры метода переносятся в стек. Одна куча разделяется всеми потоками, в то время как каждый поток имеет свой собственный стек. Следующая диаграмма показывает это:

enter image description here

Подробнее о Области времени выполнения Java во время.

Что я не понимаю, так это то, что, поскольку JVM по существу является программным обеспечением, как эти кучи JVM, стек и потоки отображаются на физическую машину?

Я был бы признателен, если бы кто-то смог сравнить эту концепцию между Java и С++. Потому что Java работает на JVM, но С++ этого не делает.

Чтобы уточнить этот вопрос, я хочу знать следующее:

  • Сравнение с Java, какова область данных времени выполнения С++? Изображение было бы полезно, я не могу найти хорошую картинку, такую ​​как JVM, которая была выше.
  • Как куча, стек, регистры и потоки JVM отображаются в операционную систему? или я должен спросить, как они сопоставляются с физической машиной?
  • Правда ли, что каждый потоки JVM - это просто пользовательский поток и каким-то образом сопоставляется с ядром? (поток пользователя vs поток ядра)

Обновление: Я рисую изображение для физической памяти процесса. enter image description here

Ответ 1

Что я не понимаю, так это то, что, поскольку JVM по существу является программным обеспечением, как эти кучи JVM, стек и потоки отображаются на физическую машину?

Куча представляет собой предварительно выделенную непрерывную область виртуальной памяти. например.

 void* heap = malloc(Xmx); // get the maximum size.

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

 void* stack = malloc(Xss); // get the maximum stack size.

Собственные потоки - это функции ОС, которые не являются частью пространства JVM как такового.

Потому что Java работает на JVM, но С++ этого не делает.

С++ по-прежнему требуется среда выполнения и библиотеки для запуска. Попробуйте удалить С++ Runtime или libc, и они не запустится.

Сравнение с Java, Что выглядит область данных времени выполнения С++?

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

Как куча, стек, регистры и потоки JVM отображаются в операционную систему? или я должен спросить, как они отображаются на физическую машину?

Опять нет волшебства. Куча JVM представляет собой область памяти, стек JVM - это тот же самый собственный стек, который использует C +, регистры JVM - это то же самое, что и родные регистры, что и использует C +, и поток JVMs фактически являются естественными потоками, что и использует C +.

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

Я должен спросить, как они отображаются на физическую машину?

один к одному в основном.

Ответ 2

JVM (виртуальная машина Java) действует как механизм времени выполнения для запуска приложений Java. JVM - это тот, который на самом деле вызывает основной метод, присутствующий в Java-коде. JVM является частью JRE (среда запуска Java).

Приложения Java называются WORA (Write Once Run Everywhere). Это означает, что программист может разрабатывать Java-код на одной системе и может ожидать, что он будет работать в любой другой Java-системе без какой-либо корректировки. Это все возможно из-за JVM. Когда мы скомпилируем файл .java, файл .class(содержащий байт-код) с тем же именем файла генерируется компилятором Java. Этот файл .class выполняет различные действия при его запуске. Эти шаги вместе описывают всю JVM.

JVM memory