Распределение сегментов памяти JVM
Итак, у меня есть вопрос, касающийся сегментов памяти JVM, я знаю, что каждая JVM решила бы реализовать это немного по-другому, но это общая концепция, которая должна оставаться неизменной во всех JVM.
Стандартная программа C / C ++, которая не использует виртуальную машину для выполнения во время выполнения, имеет четыре сегмента памяти во время выполнения. Код / стек / куча / данные - все эти сегменты памяти автоматически выделяются операционной системой во время выполнения.
Однако, когда JVM выполняет скомпилированную программу Java, во время выполнения она имеет 5 сегментов памяти.
Область метода / куча / стеки Java / регистры ПК / собственные стеки
Мой вопрос заключается в следующем: кто выделяет и управляет этими сегментами памяти? Операционная система НЕ знает о работающей java-программе и думает, что она является частью JVM, работающей как обычная программа на компьютере, JIT-компиляция, использование стеков Java, эти операции требуют выделения памяти во время выполнения, и что я непонимание того, как JVM делит свою память на эти сегменты памяти. Это определенно не выполняется операционной системой, и эти сегменты памяти (например, стеки Java) должны быть смежными для работы, поэтому, если программа JVM просто использует команду, такую как malloc, чтобы получить максимальный размер куча памяти и разделить эту память на сегменты, у нас нет никаких обещаний для непрерывной памяти, я был бы рад, если бы кто-то мог помочь мне получить это прямо в моей голове, все это перепутано ...