В куче виртуальная машина Java (JVM) хранит все объекты, созданные приложением Java, например, с помощью «нового» оператора. Java сборщик мусора (gc) может логически разделить кучу на разные области, так что gc может быстрее идентифицировать объекты, которые могут быть удалены
Память для новых объектов выделяется в куче во время выполнения. Переменные экземпляра живут внутри объекта, в котором они объявлены.
Стек - это место, где хранятся вызовы методов и локальные переменные. Если метод вызывается, то его кадр стека помещается на вершину стека вызовов. Фрейм стека содержит состояние метода, включая то, какая строка кода выполняется, и значения всех локальных переменных. Метод в верхней части стека всегда является текущим рабочим методом для этого стека. Потоки имеют свой собственный стек вызовов.
Как уже говорилось ранее, в Java объекты создаются в куче. Язык программирования не позволяет программисту решать, должны ли объекты генерироваться в стеке. Но в некоторых случаях было бы желательно выделить объект в стеке, так как выделение памяти в стеке дешевле, чем выделение памяти в куче, освобождение в стеке свободно, и стек эффективно управляется средой выполнения.
Поэтому JVM использует внутренний экранированный анализ, чтобы проверить, используется ли объект только с потоком или методом. Если JVM идентифицирует это, она может принять решение создать объект в стеке, что повысит производительность программы Java.
(http://www.ibm.com/developerworks/java/library/j-nativememory-linux/)