Ответ
Статические поля (переменные класса) хранятся в области памяти, предназначенной для метаданных класса. В спецификации JVM эта область называется Method Area. В современных реализациях (HotSpot JVM) она является частью Metaspace (или ранее PermGen).
Почему именно там? Статические поля принадлежат самому классу, а не его экземплярам. Они инициализируются при загрузке класса и существуют на протяжении всего времени жизни загрузчика классов (ClassLoader).
Пример:
public class Counter {
// Это статическое поле будет храниться в Method Area/Metaspace
public static int instanceCount = 0;
private int id;
public Counter() {
id = ++instanceCount; // Все экземпляры используют одно общее поле
}
}
// Доступ без создания объекта:
Counter.instanceCount = 10;
Ключевые особенности:
- Единственность: Одно поле на класс, общее для всех его экземпляров.
- Время жизни: Создается при инициализации класса и уничтожается при выгрузке класса сборщиком мусора (когда загрузчик классов становится недостижимым).
- Потокобезопасность: Доступ не синхронизирован по умолчанию. При работе из нескольких потоков требуется явная синхронизация или использование атомарных классов (
AtomicInteger).