2011-12-12 13 views
7

Duplicar posible:
How to avoid memory leaks in callback?¿Evita las pérdidas de memoria en las devoluciones de llamada?

Effective Java dice:

Una tercera fuente común de pérdidas de memoria es oyentes y otros devoluciones de llamada. Si implementa una API donde los clientes registran las devoluciones de llamada pero no las cancela de nuevo explícitamente, se acumularán a menos que tome alguna medida. La mejor forma de garantizar que las devoluciones de llamadas sean basura recopiladas rápidamente es almacenar solo referencias débiles para ellas, para la instancia , guardándolas solo como claves en un WeakHashMap.

No puedo entender esto. ¿alguien podría explicar esto?

+0

Aquí se responde a esta pregunta. http://stackoverflow.com/questions/2859464/how-to-avoid-memory-leaks-in-callback –

Respuesta

1

Mantener una referencia débil a un objeto no evita que se convierta en basura. Si no hay más referencias sólidas al objeto, con el tiempo será basura y ya no podrá acceder a ella a través del WeakReference has almacenado Google Java weak references tutorial para más información.

1

Significa: Si un oyente o devolución de llamada hace referencia al objeto en sí, el objeto al que se hace referencia nunca será GCed ya que el oyente o la devolución de llamada todavía está allí y hay una referencia al objeto, causando una pérdida de memoria.

3

Si agrega devoluciones de llamada a una colección, pero no las elimina, se producirá una pérdida de memoria. Una forma de manejar esto (aparte de asegurarse de que dichos objetos siempre se eliminen correctamente) es almacenar los oyentes en una colección débil. Una colección débil puede eliminar entradas cuando ese elemento/oyente ya no tiene una referencia fuerte.

El problema con este enfoque es que no se puede tener un oyente que sólo se hace referencia en la colección, ya que desaparecerá al azar (en la siguiente GC)

que tienden a utilizar los oyentes que no se hace referencia en otro sitio y tratar para garantizar que los oyentes no utilizados se eliminen correctamente.

Cuestiones relacionadas