Это действительно просто:
- объекты (то есть экземпляры классов) всегда в куче. Они не могут быть где-либо еще
- поля являются частью объектов, поэтому они также живут в куче.
- локальные переменные (включая метод / конструктор) параметры всегда в стеке. Их больше нигде не может быть.
Обратите внимание, что локальные переменные могут только содержать ссылки ("указатели") или простые значения. Локальная переменная не может содержать «объект».
Обратите внимание, что это представление - это то, что определено в спецификации JVM. Конкретная JVM может размещать объекты в области без кучи, если она этого хочет. Например: если он знает, что вновь созданный объект никогда не ускользает от текущего вызова, то он может поместить экземпляр объекта в область стека. Однако это очень оптимизация, которая не видна разработчику.