¿Las referencias invisibles siguen siendo un problema en las JVM recientes?

estaba leyendoRendimiento de la plataforma Java (lamentablemente, el enlace parece haber desaparecido de Internet desde que originalmente planteé esta pregunta) y la sección A.3.3 me preocupaba.

Había estado trabajando bajo la suposición de que una variable que cayó fuera del alcance ya no se consideraría una raíz GC, pero este documento parece contradecir eso.

¿Las JVM recientes, en particular la versión 1.6.0_07 de Sun, todavía tienen esta limitación? Si es así, entonces tengo mucho código para analizar ...

Hago la pregunta porque el documento es de 1999: a veces las cosas cambian, particularmente en el mundo de GC.

Como el documento ya no está disponible, me gustaría parafrasear la preocupación. El documento implicaba que las variables que se definieron dentro de un método se considerarían una raíz GC hasta que el método salga, y no hasta que finalice el bloque de código. Por lo tanto, establecer la variable en nulo era necesario para permitir que el Objeto al que se hace referencia sea recolectado como basura.

Esto significaba que una variable local definida en un bloque condicional en el método main () (o un método similar que contenía un bucle infinito) causaría una pérdida de memoria única a menos que anulara una variable justo antes de que se saliera del alcance.

El código de larespuesta elegida ilustra bien el problema. En la versión de la JVM a la que se hace referencia en el documento, el objeto foo no se puede recolectar basura cuando cae fuera del alcance al final del bloque try. En cambio, la JVM mantendrá abierta la referencia hasta el final del método main (), aunque sea imposible que algo use esa referencia.

Este parece ser el origen de la idea de que anular una referencia de variable ayudaría al recolector de basura, incluso si la variable estaba a punto de salir del alcance.

Respuestas a la pregunta(4)

Su respuesta a la pregunta