Ответ
В Java байт-код методов хранится в области памяти JVM, называемой Metaspace (до Java 8 — PermGen).
Что хранится в Metaspace:
- Байт-код всех загруженных классов (включая методы).
- Метаданные классов (имена, модификаторы, информация о полях и методах).
- Константы времени компиляции.
- Важно: Сами выполняемые инструкции метода (байт-код) хранятся здесь, но данные для их выполнения (локальные переменные, параметры) — в стеке потока.
Ключевые особенности Metaspace:
- Не-куча (Non-Heap): Отделена от основной кучи (Heap).
- Динамический размер: В отличие от PermGen, Metaspace по умолчанию автоматически увеличивается в пределах доступной native-памяти ОС.
- Общая для всех потоков.
Пример и визуализация:
class Calculator {
// Статическая переменная хранится в Metaspace (в структуре класса)
static String OPERATOR = "+";
// Байт-код этого метода хранится в Metaspace
int add(int a, int b) {
int result = a + b; // Локальные переменные a, b, result хранятся в стеке потока
return result;
}
}
Схема памяти JVM (упрощенно):
- Heap: Объекты, массивы.
- Metaspace: Классы, байт-код методов, статические поля.
- Stack: Локальные переменные и вызовы методов.