java - mundi - ¿Hay un uso práctico para las referencias débiles?
filipinas poblacion (9)
Como el recolector de basura puede reclamar una referencia débil en cualquier momento, ¿hay alguna razón práctica para usarla?
Por supuesto, hay razones prácticas para usarlo. Sería terriblemente extraño si los diseñadores del marco de trabajo se tomaran el enorme gasto de construir un sistema de referencia débil que no era práctico , ¿no crees?
Creo que la pregunta que pretendía hacer fue:
¿Cuáles son las situaciones realistas en las que las personas usan referencias débiles?
Hay muchos. Uno común es lograr un objetivo de rendimiento. Cuando se ajusta el rendimiento de una aplicación, a menudo se debe hacer una compensación entre más uso de memoria y más uso de tiempo. Supongamos, por ejemplo, que hay un cálculo complejo que debe realizar muchas veces, pero el cálculo es "puro": la respuesta depende únicamente de los argumentos, no de un estado exógeno. Puede construir un caché, un mapa desde los argumentos hasta el resultado, pero luego usa memoria. Es posible que nunca vuelva a hacer la pregunta y que la memoria se desperdicie.
Las referencias débiles posiblemente resuelvan este problema; la memoria caché puede ser bastante grande y, por lo tanto, se ahorra tiempo si se hace la misma pregunta muchas veces. Pero si la memoria caché es lo suficientemente grande como para que el recolector de basura necesite recuperar espacio, puede hacerlo de manera segura.
La desventaja es, por supuesto, que la política de limpieza del recolector de basura está ajustada para cumplir los objetivos de todo el sistema, no su problema específico de caché. Si la política de GC y la política de caché deseada están suficientemente alineadas, las referencias débiles son una solución altamente pragmática para este problema.
Posible duplicado:
Referencias débiles: ¿qué tan útiles son?
Como el recolector de basura puede reclamar referencias débiles en cualquier momento, ¿hay alguna razón práctica para usarlas?
El uso más común de las referencias débiles es para los valores en los mapas de "búsqueda".
Con referencias de valores normales (duros), si el valor en el mapa ya no tiene referencias en otro lugar, a menudo ya no necesita la búsqueda. Con valores de mapa débilmente referenciados, una vez que no hay otras referencias a él, el objeto se convierte en un candidato para la recolección de basura
El hecho de que el mapa tenga una (la única) referencia al objeto no impide que se recolecte basura porque la referencia es una referencia débil
Lo usamos por esa razón: en nuestro ejemplo, tenemos una variedad de oyentes que deben registrarse en un servicio. El servicio mantiene referencias débiles para los oyentes, mientras que las clases instanciadas mantienen referencias fuertes. Si las clases en cualquier momento reciben GC, la referencia débil es todo lo que queda de los oyentes, que luego también serán sometidos a GC. Hace que el seguimiento de las clases intermedias sea mucho más fácil.
Lo uso generalmente para algún tipo de caché. Los artículos recientemente accedidos están disponibles de inmediato y, en el caso de que falte el caché, vuelve a cargar el artículo (DB, FS, lo que sea).
Para evitar pérdidas de memoria, consulte este article para más detalles.
Si desea mantener una referencia a algo siempre que se use en otro lugar, por ejemplo, un Oyente, puede usar una referencia débil.
WeakHashMap se puede usar como un caché de claves de corta duración para datos derivados. También se puede usar para mantener la información sobre los objetos utilizados en otro lugar y no se sabe cuándo se descartan.
Por cierto, las referencias suaves son como referencias débiles, pero no siempre se limpiarán de inmediato. El GC siempre descartará referencias débiles cuando sea posible y retendrá referencias suaves cuando sea posible.
Hay otro tipo de referencia llamada referencia ficticia. Esto se usa en el proceso de limpieza de GC y se refiere a un objeto que no es accesible para el código "normal" porque está en proceso de limpieza.
Si una WeakReference es la única referencia a un objeto y desea que el objeto SoftReference probablemente debería estar utilizando una SoftReference .
Las WeakReferences se usan mejor en casos donde habrá otras referencias al objeto, pero no puede (o no quiere) tener que detectar cuando esas otras referencias ya no se usan. Luego, la otra referencia evitará que el objeto sea recolectado como basura, y WeakReference será solo otra forma de llegar al mismo objeto.
Dos casos de uso común son:
- Para mantener información adicional (a menudo costosamente calculada pero reproducible) sobre objetos específicos que no puede modificar directamente y sobre cuyo ciclo de vida tiene poco control. WeakHashMap es una forma perfecta de mantener estas referencias: la clave en WeakHashMap solo se mantiene débilmente, por lo que cuando se recolecta la clave, el valor también se puede eliminar del mapa y, por lo tanto, se puede recolectar basura.
- Para implementar algún tipo de sistema de eventos o notificación, donde los "oyentes" están registrados con algún tipo de coordinador, para que puedan estar informados cuando algo ocurra, pero donde no se quiere evitar que estos oyentes sean recolectados como basura cuando llegan a el final de sus vidas Una WeakReference apuntará al objeto mientras todavía está vivo, pero apunta a "nulo" una vez que el objeto original ha sido recogido.
Una referencia débil es una referencia que no protege el objeto referente de la recopilación por un recolector de basura.
- Un objeto al que se hace referencia solo por referencias débiles se considera inalcanzable (o "débilmente alcanzable") y, por lo tanto, se puede recopilar en cualquier momento.
- Las referencias débiles se utilizan para evitar que los objetos innecesarios hagan referencia a la memoria. Algunos lenguajes recogidos de basura ofrecen o admiten varios niveles de referencias débiles, como Java, C #, Python, Perl o Lisp.
- La recolección de basura se usa para reducir el potencial de pérdidas de memoria y corrupción de datos. Hay dos tipos principales de recolección de basura: seguimiento y recuento de referencias. Los esquemas de recuento de referencia registran el número de referencias a un objeto dado y recogen el objeto cuando el recuento de referencia se convierte en cero. El recuento de referencias no puede recopilar referencias cíclicas (o circulares) porque solo se puede recopilar un objeto a la vez. Los grupos de objetos de referencia mutua a los que otros objetos no hacen referencia directamente y que son inalcanzables pueden convertirse en residentes permanentes; si una aplicación genera continuamente tales grupos inaccesibles de objetos inalcanzables, esto tendrá el efecto de una pérdida de memoria. Las referencias débiles se pueden usar para resolver el problema de las referencias circulares si se evitan los ciclos de referencia utilizando referencias débiles para algunas de las referencias dentro del grupo.
- Las referencias débiles también se utilizan para minimizar el número de objetos innecesarios en la memoria al permitir que el programa indique qué objetos no son críticos al hacer una referencia débil.
Uso WeakSet
para codificar enlaces en un gráfico. Si se elimina un nodo, los enlaces desaparecen automáticamente.