2012-03-24 12 views
13

Estoy bastante seguro de que tengo fugas de memoria con la versión 2.0 de KO. Tengo una matriz observable que se completa con el resultado de una llamada AJAX. Esta colección está unida a datos con una para cada uno a un contenedor DIV. Cada objeto en la matriz tiene un único valor observable que está vinculado a una casilla de verificación. He examinado el montón usando Chrome y mi conclusión es la siguiente:KnockoutJS Memory Leak

Si la llamada AJAX devuelve 3 elementos, se representan correctamente en el DOM. Si tomo una instantánea del montón en este punto, hay tres objetos SearchResult allí. Si disparo de nuevo la llamada AJAX y devuelve 5 elementos, los 5 se procesan correctamente en el DOM. Sin embargo, si tomo una instantánea del montón en Chrome, y los comparo, hay 8 elementos enumerados como todavía en el montón, todos ellos listados como "agregados" y ninguno aparece como "eliminado". La pantalla DOM siempre es correcta, pero el uso de la memoria simplemente sigue subiendo y subiendo porque los resultados de búsqueda anteriores nunca se desasignan.

¿Alguien me puede ayudar o darme consejos para diagnosticar la fuga de memoria?

ACTUALIZACIÓN

He creado un jsFiddle para mostrar la esencia de lo que estoy haciendo. He marcado TODO, pero la funcionalidad principal y todavía puedo duplicar la pérdida de memoria cuando se ejecuta en mi máquina local. Obviamente, el código no funcionará cuando se publique porque necesita llegar a mi servidor local para ejecutar la búsqueda.

ACTUALIZACIÓN 2

Saqué la más nueva versión 2.1.0.0 Beta y la fuga desaparecieron. No soy un gran admirador de usar la versión beta de las cosas o del clásico "solo actualizar a la nueva versión". Todavía estoy muy interesado en saber qué cambió o qué estaba haciendo mal que estaba creando la filtración.

+2

¿Realmente va a mantener hasta que se queda sin memoria? Los motores JS no recogerán basura de forma inmediata, por lo que lo que está viendo podría ser simplemente el motor que no utiliza el GC ya que aún le queda mucha memoria. –

+0

He visto mi sitio usando más de 450 MB. ¿No seguiría el motor consumiendo más y más memoria hasta que no quedara nada para asignar según lo determinado por el sistema operativo? ¿No significaría eso que el sistema operativo permitiría que el navegador siga usando más y más memoria hasta que la computadora se cuelgue? ¿Cómo probaría para ver si se queda sin memoria? – arb

+0

El comportamiento es difícil de predecir. Podrías intentar hacer que repita la llamada ajax una y otra vez y ver si sigue usando más y más memoria. Podría ayudar si intenta reducir el código en un pequeño caso de prueba que puede incluir en su pregunta y si resulta ser una fuga, probablemente también deba enviarse a los desarrolladores de KO. –

Respuesta

10

No está haciendo nada incorrecto, parece que ko.cleanNode estaba ignorando las vinculaciones foreach y no desechando correctamente los objetos obsoletos dentro de la actualización observableArray.

https://github.com/SteveSanderson/knockout/issues/271

Esto se ha corregido en 2.1.0beta

+3

El [problema al que se refiere] (https://github.com/SteveSanderson/ knockout/issues/271) se cerró porque el periodista estaba usando el Knockout equivocado. No se debe invocar applyBindings() más de una vez en los mismos nodos DOM. – GregT