Oi José,
Ótima pergunta! Existem sim duas áreas de memórias: uma para a pilha e outra para o heap. Todos os objetos são alocados no heap, então fica a pergunta: o que vai para a stack?
Uma coisa que vai para a pilha são as variáveis locais (os objetos não vão, mas as referências para eles vão). Então esse código
class StackTest {
public static void main(String[] args) {
Object o1=null,o2=null,...,o12199=null;
}
}
quando rodado limitando-se o tamanho da pilha (-Xss160k diz para a JVM usar apenas 160KB para a pilha):
$ java -Xss160k StackTest
Exception in thread "main" java.lang.StackOverflowError
at StackTest.main(StackTest.java:3)
Repare que não alocamos nada! Apenas a quantidade de referências (que ficam na pilha) é suficiente para estourar a memória. Algumas outras coisas também ficam na pilha, como as chamadas e os parâmetros dos métodos (e é por isso que recursão infinita causa estouro de pilha - stack overflow). Esse tópico é relativamente complicado, então não se preocupe em aprender detalhes no início :)
OBS: No código eu coloquei ...
pois o código é grande demais para ser postado aqui no fórum. Se quiser testá-lo na sua casa, pode encontrá-lo em https://gist.github.com/gabrielrussoc/fe8b8d1f0339ad8baf7b81ae037c7b7a