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

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

Ответ

Статические члены класса (переменные и методы) хранятся в области памяти, предназначенной для метаданных классов, которая в разных версиях JVM называется по-разному:

  • До Java 8: Permanent Generation (PermGen) — часть кучи (Heap).
  • Начиная с Java 8: Metaspace — выделяется из нативной памяти (вне кучи) операционной системы.

Ключевые характеристики:

  • Загружаются в память при первой инициализации класса ClassLoader'ом.
  • Существуют на протяжении всего времени работы JVM (или до выгрузки класса).
  • Общие для всех экземпляров класса.

Пример:

class Counter {
    static int count = 0;         // Статическая переменная хранится в Metaspace.
    static void increment() {     // Байт-код статического метода также в Metaspace.
        count++;
    }
}
// Использование без создания экземпляра:
Counter.increment();
System.out.println(Counter.count);

Важно: Сами статические методы (их байт-код) и структура класса также хранятся в этой области. Статические переменные, являющиеся ссылками, хранят саму ссылку в Metaspace, а объект, на который она указывает, — в обычной куче.