2012-03-24 1 views
13

Je suis assez certain que j'ai des fuites de mémoire en utilisant KO version 2.0. J'ai un tableau observable qui est rempli avec le résultat d'un appel AJAX. Cette collection est liée à des données avec un pour chaque conteneur DIV. Chaque objet du tableau a une seule valeur observable liée à une case à cocher. J'ai examiné le tas en utilisant Chrome et ma conclusion est la suivante:KnockoutJS Memory Leak

Si l'appel AJAX renvoie 3 éléments, ils sont rendus correctement sur le DOM. Si je prends un instantané du tas à ce stade, il y a trois objets SearchResult dedans. Si je déclenche à nouveau l'appel AJAX et qu'il renvoie 5 éléments, tous les 5 sont correctement rendus au DOM. Toutefois, si je prends un instantané du tas dans Chrome et que je les compare, il y a 8 éléments listés comme étant toujours sur le tas, tous listés comme étant "ajoutés" et aucun n'étant listé comme "supprimé". L'affichage du DOM est toujours correct, mais l'utilisation de la mémoire ne cesse de grimper et de grimper parce que les anciens résultats de la recherche ne sont jamais libérés.

Quelqu'un peut-il m'aider ou me donner des conseils pour diagnostiquer la fuite de mémoire?

MISE À JOUR

J'ai créé un jsFiddle pour montrer l'essentiel de ce que je fais. J'ai rayé TOUT mais la fonctionnalité de base et je peux toujours reproduire la fuite de mémoire lors de l'exécution sur ma machine locale. Évidemment, le code ne fonctionnera pas comme il est posté car il doit frapper mon serveur local pour lancer la recherche.

MISE À JOUR 2

Je tirai la nouvelle version bêta 2.1.0.0 et la fuite a disparu. Je ne suis pas un grand fan de l'utilisation de la version bêta des choses ou du classique "juste mettre à jour vers la nouvelle version". Je suis toujours très intéressé à savoir ce qui a changé ou ce que je faisais de mal qui créait la fuite.

+2

-t-il garder en fait aller jusqu'à épuisement de la mémoire? Les moteurs JS ne ramassent pas les choses immédiatement, donc ce que vous voyez pourrait être juste que le moteur ne fait pas le GC car il lui reste encore beaucoup de mémoire. –

+0

J'ai vu mon site utilisant plus de 450MB. Le moteur ne continuerait-il pas à utiliser de plus en plus de mémoire jusqu'à ce qu'il ne reste plus à allouer comme déterminé par le système d'exploitation? Cela ne signifie-t-il pas que le système d'exploitation laisserait le navigateur continuer à utiliser de plus en plus de mémoire jusqu'à ce que l'ordinateur plante? Comment ferais-je un test pour voir s'il manque de mémoire? – arb

+0

Le comportement est difficile à prévoir. Vous pourriez essayer de faire en boucle l'appel ajax encore et encore et voir si elle continue à utiliser de plus en plus de mémoire. Peut-être que si vous essayez de réduire le code dans un petit cas de test que vous pouvez mettre dans votre question et si elle s'avère être une fuite, devrait probablement être également envoyé aux développeurs de KO. –

Répondre

10

Vous ne faites rien de mal, il semble que ko.cleanNode ignorait les liaisons foreach et ne disposait pas correctement des objets obsolètes dans le observableArray mis à jour.

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

Cela a été corrigé dans 2.1.0beta

+3

Le [problème auquel vous faites référence] (https://github.com/SteveSanderson/ knockout/issues/271) a été fermé parce que le journaliste utilisait le Knockout faux. On ne devrait pas appeler applyBindings() plus d'une fois sur le même ou les mêmes nœuds DOM. – GregT