A memória é gerenciada por meio de dois mecanismos diferentes na JVM: o heap e a stack; É por isso que existem dois erros diferentes em relação à falta de memória (OutOfMemoryError e StackOverflowError). A memória colocada no stack só é visível pela thread atual e durante a execução do método atual; portanto, quando a thread atual deixa o método atual, esta memória é liberada automaticamente sem a necessidade de um GC. A memória no heap, no entanto, é acessível por todo a aplicação, o que significa que um GC precisa verificar quando uma parte da memória não está mais em uso e pode ser recuperada.