A criação de objetos em Java é realizada explicitamente por meio de construtores. Contudo, a destruição dos objetos, sua remoção da memória, é automática e fica a cargo do coletor de lixo automático (automatic garbage collector), uma tarefa realizada pela JVM, enquanto os programas são executados.
O coletor de lixo procura continuamente por objetos que não são mais referenciados, que provavelmente não serão mais usados, marcando-os para futura remoção, quando a memória que ocupam for necessária para novos objetos. Isso simplifica o trabalho de programação, pois os objetos perdidos são automaticamente removidos à medida em que existe mais demanda por memória. No trecho que segue existe um laço onde são criados objetos. A cada interação um novo objetos é criado, de modo que o anterior fica sem referências, podendo ser marcado para remoção.
// for define um novo laço
for(int i=0; i<100;i++){
// criação de novo objeto, referencia anterior é perdida
Objeto obj = new Objeto();
}
Embora seja impossível prever quando o coletor de lixo irá remover os objetos sem uso, é possível forçar a pesquisa e remoção dos objetos não referenciados com uma chamada ao coletor, mas é necessário destacar que isso não garante a remoção de todos os objetos:
//aciona o coletor de lixo para tentar remoção de objetos não usados
System.gc();
Embora a coleta automática de lixo resolva grande maioria das situações envolvendo a criação e destruição de objetos, existem situações particulares em que o objeto deve devolver recursos alocados do sistema ou encerrar conexões com outros programas (por exemplo, banco de dados). Esses casos pedem a implementação dos finalizadores, métodos cuja assinatura obrigatória é:
protected void finalize(){
}
Todos os finalizadores definidos nas classes são executados pelo coleto de lixo quando os respectivos objetos são removidos da memória. Mas como não se pode prever quando o coletor de lixo irá, de fato, remover os objetos, não existem garantias quanto ao momento de execução dos finalizadores dos objetos quando estes deixam de ser referenciados.
Fonte: Java: Guia do programador, Peter Jandl Júnior