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

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

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

введите описание изображения здесь

Больше о Области данных Java во время выполнения.

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

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

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

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

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

49

Решение

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

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

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

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

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

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

Потому что Java работает на JVM, а C ++ — нет.

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

По сравнению с Java, как выглядит область данных C ++ во время выполнения?

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

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

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

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

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

один в один в принципе.

33

Другие решения

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

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

Память JVM

4

По вопросам рекламы [email protected]