¿Qué es una referencia débil?

Una referencia débil es una referencia a un objeto en la memoria que no evita que un objeto sea limpiado por las rutinas de recolección de basura debido a su asociación con el objeto. Este tipo de referencia se usa comúnmente para ayudar a eliminar las pérdidas de memoria cuando existen condiciones especiales que evitan que ocurra la recolección de basura normal. Los algoritmos de programación que usan una referencia circular o mantienen información extraña en una caché o estructura especial se benefician al usar referencias débiles. La utilización de referencias débiles en este tipo de situaciones permite limpiar los objetos de referencia no utilizados y sus referencias débiles asociadas.

En la programación de computadoras, una referencia fuerte generalmente se crea de forma predeterminada cuando se crea un objeto, y la memoria ocupada por el objeto permanece asignada siempre que la referencia sólida siga siendo viable. Una referencia fuerte se anula y la memoria de su objeto asociado se libera poco después de una referencia fuerte y su objeto se marca como que ya no está siendo utilizado por un programa. En determinadas situaciones, como la programación de sockets o las aplicaciones de manipulación de imágenes, las clases utilizadas para crear objetos de trabajo no tienen la capacidad incorporada para almacenar información adicional que es necesaria para una aplicación específica. Los detalles adicionales de los objetos transitorios, como conexiones o imágenes, deben almacenarse en objetos de caché suplementarios y vincularse a los objetos transitorios mediante referencias. Cuando se usa una referencia débil en lugar de una referencia fuerte, la información adicional no está limitada por la referencia y el recolector de basura puede eliminarla de la caché una vez que el objeto de referencia se ha marcado como no viable.

Las clases de referencia débiles normalmente están disponibles en lenguajes que se complementan con subsistemas de recolección de basura, incluidos Java, Python, Perl, C # y .NET framework. En C ++, sin embargo, los programadores suelen ser responsables de garantizar la limpieza de la memoria. Este lenguaje ha implementado una clase de puntero inteligente que proporciona algunas de las mismas funcionalidades que proporcionan las referencias débiles y la recolección de basura, lo que ayuda a reducir las pérdidas de memoria causadas por una limpieza incorrecta del puntero.

Para facilitar aún más la administración de la memoria, los lenguajes con instalaciones de recolección de basura pueden mejorar adicionalmente la funcionalidad de un idioma al proporcionar gradientes de referencias más finos que no sean la referencia fuerte o débil. Los tipos de datos, como referencias suaves y referencias fantasmas, pueden incluirse en estos lenguajes, lo que permite diferentes niveles de notificación de recuperación o desasignación de objetos. Los programadores que usan lenguajes con recolección de basura automatizada deben familiarizarse con todas las clases de referencia que están disponibles para mejorar el rendimiento de la aplicación.