As referências invisíveis ainda são um problema nas JVMs recentes?

eu estava lendoDesempenho da plataforma Java (infelizmente, o link parece ter desaparecido da internet desde que eu fiz a pergunta originalmente) e a seção A.3.3 me preocupou.

Eu trabalhava no pressuposto de que uma variável que saiu do escopo não seria mais considerada uma raiz do GC, mas este artigo parece contradizer isso.

As JVMs recentes, em particular a versão 1.6.0_07 da Sun, ainda têm essa limitação? Nesse caso, tenho muito código para analisar ...

Faço a pergunta porque o artigo é de 1999 - às vezes as coisas mudam, particularmente no mundo da GC.

Como o documento não está mais disponível, gostaria de parafrasear a preocupação. O artigo implicava que as variáveis definidas dentro de um método seriam consideradas uma raiz do GC até o método sair, e não até o término do bloco de código. Portanto, a configuração da variável como nula era necessária para permitir que o objeto referenciado fosse coletado como lixo.

Isso significava que uma variável local definida em um bloco condicional no método main () (ou método semelhante que continha um loop infinito) causaria um vazamento de memória único, a menos que você nulasse uma variável imediatamente antes de sair do escopo.

O código doresposta escolhida ilustra bem a questão. Na versão da JVM mencionada no documento, o objeto foo não pode ser coletado como lixo quando cair fora do escopo no final do bloco try. Em vez disso, a JVM manterá aberta a referência até o final do método main (), mesmo que seja impossível para qualquer coisa usar essa referência.

Parece ser a origem da ideia de que anular uma referência de variável ajudaria o coletor de lixo, mesmo se a variável estivesse prestes a sair do escopo.

questionAnswers(4)

yourAnswerToTheQuestion