Что занимает больше памяти в JVM: Heap или Stack?

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

Ответ

Heap (куча) обычно занимает значительно больше памяти, чем Stack (стек).

  • Heap предназначен для хранения объектов, массивов и статических переменных. Его размер настраивается флагами JVM (-Xms, -Xmx) и может достигать гигабайт.
  • Stack хранит локальные примитивы, ссылки на объекты и фреймы методов (стек вызовов). Размер стека настраивается флагом -Xss и обычно составляет мегабайты на каждый поток.

Пример:

public class MemoryExample {
    public static void main(String[] args) {
        int localVar = 42; // Примитив хранится в стеке (Stack)
        Object obj = new Object(); // Сам объект создается в куче (Heap),
                                   // а ссылка 'obj' хранится в стеке.
    }
}

Почему так? Куча должна вмещать все данные приложения, созданные во время его работы, в то время как стек содержит только контекст выполнения для активных методов каждого потока.