Como em Java você não deve mexer diretamente com memória referências não são realmente endereços de memória, mas uma identidade lógica
Stack
É o contexto de memória de uma thread
Onde são armazenadas variáveis locais de métodos
Só é capaz de armazenar primitivos e referências a objetos
Heap
Área de memória compartilhada entre diferentes métodos e threads
Onde são armazenados Classes e Objetos
Passagem de parâmetros
O valor passado por parâmetro tem seu valor duplicado na stack
Se o valor for uma referência, apenas o endereço da referência será duplicado; a instância sendo manipulada será a mesma; se algum valor dessa referência for alterado, o valor na referência base será também alterado
Se for um primitivo, o valor será duplicado; ou seja, alterar o valor passado como parâmetro não interfere com o valor base
Memory Cleanup
Garbage collection não limpa a memória logo de que encontra um Objeto não-referenciado; apenas limpa a memória quando seu programa precisa, evitando gastar tempo do CPU com esse processo quando não necessário
Um Objeto se torna um candidato a garbage collection quando não existe nenhuma referência para ele