Что такое стек и куча в контексте памяти
Что проверяют
Понимаете ли вы, где на самом деле живут данные в Java, и связываете ли это с отказами, которые видно в бою: переполнением стека при рекурсии и нехваткой кучи под нагрузкой. Заодно смотрят, не переносите ли вы правила языков с ручным управлением памятью на среду со сборщиком мусора.
Как отвечать
Стек свой у каждого потока и хранит кадры вызовов: аргументы, локальные переменные примитивных типов и ссылки. Кадр появляется при входе в метод и исчезает при выходе, освобождение ничего не стоит, порядок строго обратный вызовам. Размер задаётся при запуске и невелик, потому что таких областей столько же, сколько потоков.
Куча общая для всех потоков, и все объекты, включая массивы и строки, создаются в ней. В стеке лежит только ссылка. Память освобождает сборщик мусора, когда до объекта больше не дотянуться от корней. Метаданные классов живут отдельно, вне кучи.
Отсюда два разных отказа: бесконечная рекурсия исчерпывает кадры и даёт переполнение стека, а удержанные ссылки или заниженный лимит кучи дают нехватку памяти. Первое лечат переписыванием обхода на итеративный, второе поиском того, кто держит ссылку.
Сильное дополнение: именно потому, что куча общая, а стек приватный, вопросы видимости и синхронизации касаются полей объектов, а не локальных переменных.
Где спотыкаются
Говорят, что мелкие объекты размещаются на стеке. В модели языка объекта на стеке нет никогда. Оптимизатор умеет разобрать объект, не покидающий метод, на отдельные значения и не выделять память вовсе, но это решение времени исполнения, на которое нельзя рассчитывать при проектировании.
Считают выделение в куче дорогим. Новый объект обычно получается сдвигом указателя в буфере, выданном потоку, и стоит копейки. Дорого обходится не создание, а сборка и выживание объекта при переносе между поколениями, поэтому экономят не на аллокациях, а на долгоживущем мусоре.
Путают исчерпание кучи с утечкой. Нехватка памяти означает лишь, что живых объектов больше лимита. Причиной бывает и честно растущий кеш без вытеснения, и слишком маленький лимит, и накопление в статических коллекциях. Сначала снимают дамп и смотрят, кто держит ссылки, а лимит поднимают потом.