Я знаю, что это зависит от JVM, и каждая виртуальная машина предпочла бы реализовать его немного по-другому, но я хочу понять общую концепцию.
Было сказано, что для сегментов памяти, которые JVM использует для выполнения программы Java
- Стеки Java
- куча
- Область метода
- Регистры ПК
- Стеки нативных методов
не обязательно реализуются с непрерывной памятью и могут быть фактически выделены в некоторой памяти кучи, предоставленной ОС, это приводит меня к моему вопросу.
- JVM, которые полностью используют механизм JIT и компилируют методы байт-кода в собственные методы машинного кода, где-то хранят эти методы, где бы это было? механизм выполнения (который обычно написан на C/C++) должен будет вызывать эти скомпилированные функции JIT, но ядро не должно позволять программе выполнять код, сохраненный в сегменте стека/кучи/статической памяти, как JVM может преодолеть это?
- Другой вопрос, который у меня есть, касается стеков Java, когда метод (после JIT-компиляции) выполняется в процессоре, его локальные переменные должны быть сохранены в стеках Java, но опять же стеки Java могут быть реализованы с несмежной памятью и, возможно, даже просто некоторая структура данных стека, выделенная в куче, действующая как стек, как и где сохраняются локальные переменные выполняемого метода? ядро не должно позволять программе обрабатывать память, выделенную кучей, как стек процесса, как JVM преодолевает это сложно?
Опять же, я хочу подчеркнуть, что я прошу общую концепцию, я знаю, что каждая JVM решит реализовать это немного по-другому...