¿Qué les sucede a los objetos desreferenciados en Java? ¿Se borran de la memoria o permanecen inaccesibles?

Suponiendo que desreferenciado quiere decir perder el último puntero que estaba en el código en ejecución: se reduce un poco de sobrecarga de administración de memoria para cada objeto llamado recuento de referencia , y cuando llega a 0, el objeto queda disponible para el recolector de basura del sistema . Esto significa que Java puede estar seguro de que, cuando finaliza un ámbito determinado, todos los objetos cuyas referencias pertenecían a él y, por lo tanto, desaparecieron, tienen sus destructores en ejecución y se limpian de la memoria.

(Por supuesto, el código debería hacer estas disposiciones por sí mismo: es un error en el algoritmo el asignar objetos que luego olvida desechar. Pero al menos el sistema Java no es vulnerable a perder memoria disponible por la acumulación de basura debido a estos loco.)

El recolector de basura está realmente disponible para el código como System.gc (); (suponiendo que no haya cambiado en las versiones desde que estaba haciendo esto). Esto no hace que el recopilador se ejecute directamente, porque cuando eso sucede lo decide el sistema de tiempo de ejecución, pero aumenta la preparación del sistema para ejecutarlo. He visto código de muestra donde System.gc (); se llama 3 veces seguidas para intentar insinuar al sistema que ahora sería un buen momento para hacerlo.

Tenga en cuenta que, técnicamente, desreferenciar significa tomar la referencia (puntero) al objeto (que en Java es el nombre del objeto mismo) y seguir esa referencia para obtener el objeto en sí. Técnicamente no significa eliminar referencias al objeto, por razonable que parezca.

Se dice que son elegibles para la recolección de basura.

Una vez que se desreferencia un objeto, es decir, a la variable de referencia que apunta a él se le asigna la dirección de otro objeto o algún otro valor (nulo), no se puede hacer referencia al objeto referido previamente de ninguna manera. La JVM marca este objeto como desreferenciado y sin usar.

La recolección de basura (gc) en java es aleatoria y entra en acción cuando es necesario, ni demasiado pronto (para que la ejecución del programa sea eficiente) ni demasiado tarde (para aumentar la memoria disponible para la ejecución del programa). JVM está muy optimizado para determinar el tiempo debería lanzar el recolector de basura.

El recolector de basura de Java Virtual Machine elimina la referencia del objeto tan pronto como el compilador se mueve fuera del bloque o del alcance del objeto. La recolección de basura se ejecuta como un proceso en segundo plano y envía la memoria liberada en el montón.

Podemos desreferenciar explícitamente el objeto asignándolo a nulo.

Esto no libera la memoria, pero las referencias a la variable del objeto ahora se han borrado y el recolector de basura liberará la memoria la próxima vez que se ejecute.

El recolector de basura devolverá la memoria que ya no usan las variables al montón. Se ejecuta como un proceso en segundo plano y, en la mayoría de los casos, se puede dejar que se administre solo.

Y es obvio que durante el tiempo que esté en el alcance definido del objeto, sería accesible.