¿Se puede hacer algún daño por uso excesivo de WR?
Sí, puede.
Una de las preocupaciones es que las referencias débiles hacen que su código sea más complicado y potencialmente propenso a errores. Cualquier código que use una referencia débil necesita tratar con la posibilidad de que la referencia se haya roto cada vez que la use. Si usa referencias débiles en exceso, termina escribiendo muchos códigos adicionales. (Puede mitigar esto ocultando cada referencia débil detrás de un método que se encarga de la verificación, y vuelve a crear el objeto descartado a pedido. Pero esto puede no ser necesariamente tan simple como eso, por ejemplo, si el proceso de recreación involucra a la red acceso, debe hacer frente a la posibilidad de una falla de recreación.)
Una segunda preocupación es que hay gastos generales de tiempo de ejecución con el uso de referencias débiles.Los costos obvios son los de crear referencias débiles y llamar al get
. Un costo menos obvio es que se necesita hacer un trabajo adicional significativo cada vez que se ejecuta el GC.
Una última preocupación es que si utiliza referencias débiles para algo que es muy probable que necesite su aplicación en el futuro, puede incurrir en el costo de volver a crearla repetidamente. Si este costo es alto (en términos de tiempo de CPU, ancho de banda IO, tráfico de red, lo que sea) su aplicación puede funcionar mal como resultado. Puede que sea mejor darle a la JVM más memoria y no utilizar referencias débiles en absoluto.
Por supuesto, esto no significa que deba evitar el uso de referencias débiles por completo. Solo que necesitas pensar cuidadosamente. Y probablemente primero deba ejecutar un generador de perfiles de memoria en su aplicación para averiguar de dónde provienen sus problemas de uso de memoria.
Pareja más ejemplos de usos para referencias débiles en http://stackoverflow.com/questions/1434156/other-uses-of-weak-references –
Por lo que sé, el único peligro con WR es que en realidad podría querer a * strong * referencia. Si tus objetos comienzan a desaparecer cuando no los quieres, es posible que hayas ido demasiado lejos;) –
Debes saber cuándo usarlos y cómo, y en algunos casos se trata de problemas similares a los encontrados en el multihilo con bloqueo en datos. Por ejemplo, es simplemente incorrecto para una muestra (.NET): 'if (x.IsAlive) {x.Target.ToString(); } 'porque el objeto puede haber sido recolectado mientras tanto. Primero tiene que adquirir una referencia fuerte y luego verificar si todavía está viva: 'object t = x.Target; if (t! = null) {t.ToString(); } 'porque tan pronto como hayas vuelto a adquirir una referencia fuerte al objeto, no se recopilará. – Lucero