Перед тем, как вы сможете «использовать» экземпляр класса, необходимо выполнить три вещи, каждая из которых влечет за собой выделение кучи памяти:
Байт-коды классов должныбыть загруженным и связанным для разрешения любых статических зависимостей от других классов.
Класс должен быть инициализирован.
Экземпляр потребностей классабыть созданным.
Загрузка и связывание классов обычно происходит при запуске JVM, хотя это может быть выполнено "лениво" JVM, и это может быть сделано динамически;например, используя Class.forName(...)
.Это когда память для классов "code" выделяется.
Инициализация класса обычно выполняется непосредственно перед первым использованием класса.(Точные детали изложены в JLS).Это когда память для статики классов будет выделена.
Создание класса происходит при использовании конструкции new
.Это также вызовет инициализацию класса для класса, который еще не был инициализирован.Это когда память для экземпляра выделяется.
В дополнение к вышесказанному, в какой-то момент JVM может запустить JIT-компилятор, чтобы превратить байт-коды для класса в собственный код.Когда (и действительно, если) это произойдет, зависит от версии JVM и параметров запуска JVM.JIT-компиляция, конечно, выделит память для хранения скомпилированного нативного кода классов.