Duração de uma instância de classe (Gerenciamento de memória!?)

Queridos GUJ’s,

Em uma classe X, qual a duração da instância de uma classe Y criada em um método de X?
Ela dura enquanto o método estiver sendo executado, correto?

sim

se quiser saber mais, leia sobre garbage collector: http://www.guj.com.br/articles/28

Tudo que for criado e executado dentro de um método, só dura enquanto ele estiver em execução. Seja a instancia de uma classe ou mesmo um simples variável local.

[quote=rafaelvalle]Queridos GUJ’s,

Em uma classe X, qual a duração da instância de uma classe Y criada em um método de X?
Ela dura enquanto o método estiver sendo executado, correto?

[/quote]

Não é tão simples assim. Um objeto permanece no heap enquanto ele não é coletado pelo GC. Mesmo que não haja referências para este objeto, ele continua lá enquanto o GC não o coletar. Essa implicação é importante, pois mesmo que não haja referências para o objeto, ele continua ocupando espaço na memória.

Outro fato que muitos ignoram, ou não observam com cuidado é a regra de eligibilidade de um objeto para GC. Para que um objeto seja elegível para GC ele deve ser alcançável a partir de uma thread. Isso significa que em um dado momento da execução do programa, deve haver alguma referência na pilha de execução através da qual é possível navegar até o objeto.

Voltando ao seu exemplo, o que morre no momento em que o método termina é a referência para o objeto da classe Y. Sendo assim, temos 1 referência a menos para o objeto Y. Geralmente, se a única referência para o objeto era uma variável local, o objeto é coletado imediatamente. Mas isso é particularidade do GC do HotSpot, nem todas as VM’s precisam seguir esse comportamento.