Где и как хранятся методы в Java?

«Где и как хранятся методы в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java байт-код методов хранится в области памяти JVM, называемой Metaspace (до Java 8 — PermGen).

Что хранится в Metaspace:

  • Байт-код всех загруженных классов (включая методы).
  • Метаданные классов (имена, модификаторы, информация о полях и методах).
  • Константы времени компиляции.
  • Важно: Сами выполняемые инструкции метода (байт-код) хранятся здесь, но данные для их выполнения (локальные переменные, параметры) — в стеке потока.

Ключевые особенности Metaspace:

  1. Не-куча (Non-Heap): Отделена от основной кучи (Heap).
  2. Динамический размер: В отличие от PermGen, Metaspace по умолчанию автоматически увеличивается в пределах доступной native-памяти ОС.
  3. Общая для всех потоков.

Пример и визуализация:

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: Локальные переменные и вызовы методов.