Objetos vs. Referências
Não confunda uma referência com o objeto ao qual ela se refere; eles são duas entidades diferentes. A referência é uma variável que possui um nome e pode ser usada para acessar o conteúdo de um objeto. Uma referência pode ser atribuída a outra referência, passada a um método ou retornada de um método. Todas as referências são do mesmo tamanho, independentemente do tipo.
Um objeto fica no heap e não possui um nome. Portanto, você não tem como acessar um objeto, exceto por meio de uma referência. Objetos vêm em todas as formas e tamanhos diferentes e consomem quantidades variáveis de memória. Um objeto não pode ser atribuído a outro objeto, nem um objeto pode ser passado para um método ou retornado de um método. É o objeto que recebe o lixo coletado, não sua referência.
Perceber a diferença entre uma referência e um objeto é um longo caminho para entender a coleta de lixo, o novo operador e muitas outras facetas da linguagem Java. Olhe para este código e veja se você pode descobrir quando cada objeto se torna elegível para coleta de lixo:
1: public class Scope {
2: public static void main(String[] args) {
3: String one, two;
4: one = new String("a");
5: two = new String("b");
6: one = two;
7: String three = one;
8: one = null;
9: } }
Quando for feita uma pergunta sobre a coleta de lixo no exame, recomendamos você desenhar o que está acontecendo. Há muita coisa para acompanhar tudo em sua cabeça e é fácil de fazer cometer um erro bobo tentando manter tudo na sua memória. Vamos tentar juntos agora. Mesmo. Arranje um lápis e papel. Bem espere.
Tem aquele papel? Ok, vamos começar. Na linha 3, escrevemos one e two. Apenas as palavras. Não há necessidade de caixas ou flechas, uma vez que ainda não há objetos na pilha. Na linha 4, nós temos nosso primeiro objeto. Desenhe uma caixa com a escrita "a" nela e desenhe uma seta a partir da palavra one para essa caixa. A linha 5 é semelhante. Desenhe outra caixa com a palavra "b" nela desta vez e uma flecha da palavra two. Neste ponto, seu trabalho deve se parecer com a Figura 1.2.
Na linha 6, a variável muda e começa apontar para "b". Apague ou risque a seta de one e desenhe uma nova seta de one para "b". Na linha 7, temos uma nova variável, então escreva a palavra three desenhe uma seta de three para "b". Observe que três pontos estão apontando agora e não o que estava apontando no começo. É por isso que estamos desenhando. É fácil esquecer algo assim. Neste ponto, seu trabalho deve se parecer com a Figura 1.3.
Por fim, risque a linha entre one e "b", pois a linha 8 define essa variável como nula. Agora, estávamos tentando descobrir quando os objetos estavam qualificados para a coleta de lixo. Na linha 6, nos livramos da única seta apontando para "a", tornando esse objeto elegível para coleta de lixo. "b" tem setas apontando para ele até que saia do escopo. Isso significa "b" não sai do escopo até o final do método na linha 9.