¿Qué es una referencia débil?
Una referencia débil es una referencia a un objeto en la memoria que no impide 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 impiden la recolección normal de basura. Los algoritmos de programación que usan una referencia circular o contienen información extraña en un caché o estructura especial se benefician al usar referencias débiles. La utilización de referencias débiles en este tipo de situaciones permite la limpieza de objetos referentes no utilizados y sus referencias débiles asociadas.
En la programación de computadoras, una referencia fuerte generalmente se crea de manera predeterminada cuando se crea un objeto, y la memoria ocupada por el objeto permanece asignada mientras la referencia fuerte permanezca viable. Una referencia fuerte se anula y la memoria de su objeto asociado se libera poco después de que una referencia fuerte y su objeto se marquen como si ya no los utiliza un programa. En ciertas 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 necesita una aplicación específica. Los detalles adicionales para objetos transitorios, como conexiones o imágenes, deben almacenarse en objetos de caché suplementarios y vincularse a los objetos transitorios mediante referencias. Cuando se utiliza una referencia débil en lugar de una referencia fuerte, la información adicional no está vinculada por la referencia y el recolector de basura puede eliminarla de la memoria 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 ven aumentados por los subsistemas de recolección de basura, incluidos Java, Python, Perl, C # y el marco .NET. Sin embargo, en C ++, 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 la limpieza incorrecta del puntero.
Para facilitar aún más la gestión de la memoria, los idiomas con funciones de recolección de basura pueden mejorar adicionalmente la funcionalidad de un idioma al proporcionar gradientes más finos de referencias que no sean la referencia fuerte o débil. Los tipos de datos tales como referencias suaves y referencias fantasmas pueden incluirse en estos idiomas, lo que permite diferentes niveles de recuperación de objetos o notificación de desasignación. Los programadores que usan idiomas con recolección de basura automatizada deben familiarizarse con todas las clases de referencia disponibles para mejorar el rendimiento de la aplicación.