2012-04-23 15 views
6

Estoy creando un nuevo presentador de este modo:GWT recolección de elementos

new MyPresenter(new MyView()); 

Se registra algunos controladores de eventos y se une a la vista y tal. Eventualmente, podría "cerrar" esa vista para que el navegador ya no la represente. No estoy manteniendo una referencia a esta instancia de MyPresenter en cualquier lugar.

En los foros de Google sobre este tema, la respuesta convencional es "configurar sus referencias a nulo" y luego no se preocupe por ello. A diferencia de Javascript, no puedo simplemente decir this = null; en Java por razones obvias. Pero en Javascript, es muy fácil anular referencias de objetos que sé que ya no se usarán.

Mi pregunta: ¿Cómo puedo saber si este presentador ha sido recolectado como basura, ya que no mantengo una referencia al mismo? Es muy claro que existe. ¿Debo tener fe en que GWT y JS se encargarán de esto? ¿O debo mantener mi propia referencia en MyPresenter para poder hacerlo manualmente al null cuando termine?

+0

Depende del navegador. Básicamente, si no tiene referencias a los objetos, se recopilará, pero hay errores, como el famoso error en IE con referencias cruzadas entre los objetos DOM y JS (los componentes predeterminados en GWT generalmente están protegidos de esto), o algunos recolectores de basura no pudieron eliminar islas de objetos Como hay muchos navegadores, no existe un truco o herramienta universal para combatir este problema. La única opción es ejecutar pruebas de rendimiento y verificar el uso de la memoria. – jusio

+0

No ** nunca ** tengo una referencia a ese objeto desde mi código (usuario), sin embargo, es probable que exista porque puede manejar eventos si los disparo. Sin embargo, si elimino estos manejadores de eventos y anulo 'MyView' es suficiente para hacer que sea GC'd? Mi temor es que no lo sea. –

+0

@TravisWebb it * debe ser * suficiente. Pero los accidentes ocurren. No puedo encajar en uno comentarios todos los errores relacionados con GC, pero suceden desde el momento. Si elimina todas las referencias al objeto, debe recopilarse (agregar algo como detector de eventos, contar como crear una referencia, ya que algún objeto en alguna parte debe saber dónde enviar eventos) – jusio

Respuesta

2

Hay dos tipos de pérdidas de memoria: memoria de nivel

  • DOM/navegador fugas de
  • pérdidas de memoria de aplicaciones.

Las fugas de memoria del nivel DOM/del navegador suelen durar después de cerrar la aplicación. AFAIK solo los navegadores antiguos (IE6) se ven afectados y esa es la razón por la cual GWT usa un special way para adjuntar manejadores.
Esto no debería ser un problema con los navegadores modernos, al menos no serán un problema si cierra la aplicación. Sin embargo, pueden convertirse en fugas de memoria de la aplicación. (Ver here para más detalles). Pero, en general, el Javascript GC moderno es bastante bueno para liberar memoria no utilizada.

Las fugas de memoria de la aplicación pueden ser un problema con las aplicaciones de larga ejecución y cuando crea dinámicamente una gran cantidad de vistas/presentadores y mantiene la referencia a través de Manejadores de eventos. Pero aquí realmente depende del alcance de las partes involucradas.
Este post es una buena referencia con más información al respecto.

Finalmente, para asegurarse de que realmente no tiene ninguna pérdida de memoria de la aplicación, debe usar el Dev Tools Heap Profiler para verificar el consumo de memoria durante un período más prolongado.
Este blog post tiene más información al respecto.

Cuestiones relacionadas