javascript - recoleccion - recolector de basura java ejemplo
Forzar la recolección de basura en Google Chrome (3)
En las Herramientas para Desarrolladores de Chrome tienes la sección "Línea de tiempo", de alrededor de Chrome 53. tienes el botón que parece Bote de Basura. haciendo clic en él y forzando al recolector de basura a correr.
Estamos desarrollando una aplicación web de una sola página con ZK que se comunica constantemente con el servidor y actualiza partes de sus pantallas. La actualización puede ser tan frecuente como 1s. Durante estas actualizaciones, las referencias a grandes cantidades de objetos JS se pierden y esos objetos tienen que ser limpiados por el recolector de basura eventualmente.
Por lo que hemos descubierto, Chrome solo ejecuta su recolector de basura en pestañas inactivas. Esto es un problema para nosotros, ya que la pestaña de la aplicación generalmente está activa y casi nunca se actualiza, por lo que los objetos JS nunca se recopilan. Si se deja activo durante el tiempo suficiente, la pestaña finalmente se bloquea ( Aww Snap message).
Necesitamos iniciar la recolección de basura manualmente. Hasta ahora, hemos intentado ejecutar Chrome con --js-flags="--expose-gc"
y ejecutar gc()
, pero arroja una excepción:
ReferenceError: gc is not defined
Esto no ocurre en Firefox: el uso de la memoria es más o menos una constante.
Forzar la actualización de la página no es una opción.
Agradeceríamos cualquier sugerencia.
EDITAR : hemos intentado ejecutar window.gc()
y gc()
ambos en las versiones de Chrome 23.0.1271.97 m
25.0.1364.2 dev-m
Encontré una solución. Aparentemente, Chrome pierde nodos DOM, al menos en la versión actual (26.0.1410.65 en este momento)
Grabé la línea de tiempo de las herramientas de desarrollo en mi aplicación y mostró que el recuento de oyentes de eventos subía y bajaba rítmicamente junto con el contenido de la pantalla de mi aplicación, pero el recuento de nodos DOM aumentaba constantemente con el tiempo, hasta que la pestaña se bloqueaba.
Probé el último Chrome Canary (28.0.1500.3) y parece que solucionaron el problema. El gráfico de recuento de nodos DOM ahora sigue el mismo patrón rítmico que los Escuchadores de eventos.
Lo que me atrapa es ... ¿por qué nunca falla Gmail? Por lo general, mantengo una pestaña abierta durante semanas a la vez ...
Puede buscar el código de Herramientas de desarrollo de Chrome, modificarlo para que ProfilerAgent.collectGarbage();
se llama de vez en cuando (se llama a un código cuando se hace clic en el botón "Recolectar basura" en el panel Línea de tiempo) y se ejecuta Chrome con su versión de DevTools utilizando --debug-devtools-frontend
indicador.
Sin embargo, esta solución es bastante extrema, pruébala solo cuando te sientas realmente desesperado. Hasta entonces, propongo perfilar tu aplicación y verificar por qué v8 decide no limpiar la basura (o no puede limpiar la basura). El panel de línea de tiempo de DevTools te ayudará con esto. Comience por verificar si el botón ''Recolectar basura'' en la parte inferior de este panel realmente hace su trabajo, de lo contrario, probablemente tenga una pérdida de memoria (al menos, de acuerdo con la v8). Si es así, prueba leak-finder-for-javascript .
[ EDITAR ] Eliminé información sobre la extensión de Chrome, ya que resulta que se puede llamar a gc()
desde el código de la página web cuando se --js-flags="--expose-gc"
. Al menos en mi 23.0.1271.64.