J'ai créé un cas de test très simple qui crée une vue Backbone, attache un gestionnaire à un événement et instancie une classe définie par l'utilisateur. Je crois qu'en cliquant sur le bouton "Supprimer" dans cet exemple, tout sera nettoyé et il ne devrait pas y avoir de fuites de mémoire.
Un jsfiddle pour le code est ici : http://jsfiddle.net/4QhR2/
// tout est contenu dans une fonction
function main() {
function MyWrapper() {
this.element = null;
}
MyWrapper.prototype.set = function(elem) {
this.element = elem;
}
MyWrapper.prototype.get = function() {
return this.element;
}
var MyView = Backbone.View.extend({
tagName : "div",
id : "view",
events : {
"click #button" : "onButton",
},
initialize : function(options) {
// fait à des fins de démonstration uniquement, devrait utiliser des templates
this.html_text = "Supprimer";
this.listenTo(this,"all",function(){console.log("Événement: "+arguments[0]);});
},
render : function() {
this.$el.html(this.html_text);
this.wrapper = new MyWrapper();
this.wrapper.set(this.$("#textbox"));
this.wrapper.get().val("placeholder");
return this;
},
onButton : function() {
// supposons que .remove() est appelé sur les sous-vues (si elles existaient)
this.trigger("cleanup");
this.remove();
}
});
var view = new MyView();
$("#content").append(view.render().el);
}
main();
Cependant, je ne suis pas certain de savoir comment utiliser le profileur de Google Chrome pour vérifier que c'est bien le cas. Il y a une multitude de choses qui apparaissent dans l'instantané du profileur de la heap, et je n'ai aucune idée de comment décoder ce qui est bon/mauvais. Les tutoriels que j'ai vus à ce sujet se contentent soit de me dire d'utiliser le profileur d'instantanés, soit de me donner un manifeste extrêmement détaillé sur le fonctionnement de tout le profileur. Est-il possible d'utiliser le profileur comme un outil, ou dois-je vraiment comprendre comment l'ensemble a été conçu ?
EDIT : Des tutoriels comme ceux-ci :
Corriger une fuite de mémoire dans Gmail
Sont représentatifs de certains des contenus les plus solides disponibles, d'après ce que j'ai vu. Cependant, à part introduire le concept de la Technique des 3 Instantanés, je trouve qu'ils offrent très peu de connaissances pratiques (pour un débutant comme moi). Le tutoriel 'Utilisation de DevTools' ne travaille pas sur un exemple concret, donc sa description vague et conceptuelle générale des choses n'est pas très utile. Quant à l'exemple de 'Gmail' :
Donc vous avez trouvé une fuite. Et maintenant ?
Examinez le chemin de rétention des objets en fuite dans la moitié inférieure du panneau Profiles
Si le site d'allocation ne peut pas être facilement déduit (par exemple les écouteurs d'événements) :
Instrumentez le constructeur de l'objet de rétention via la console JS pour sauvegarder la trace de la pile pour les allocations
Utilisez Closure ? Activez le drapeau existant approprié (par exemple goog.events.Listener.ENABLE_MONITORING) pour définir la propriété creationStack pendant la construction
Je me retrouve plus confus après avoir lu cela, pas moins. Et, une fois de plus, on me dit simplement de faire des choses, sans m'expliquer comment les faire. De mon point de vue, toutes les informations disponibles sont soit trop vagues, soit ne seraient compréhensibles que par quelqu'un qui aurait déjà compris le processus.
Certains de ces problèmes plus spécifiques ont été abordés dans la réponse de Jonathan Naguin ci-dessous.
2 votes
Je ne sais rien sur le test d'utilisation de la mémoire dans les navigateurs, mais au cas où vous ne l'auriez pas vu, l'article d'Addy Osmani sur l'inspecteur Web Chrome pourrait être utile.
1 votes
Merci pour la suggestion, Paul. Cependant, lorsque je prends un instantané avant de cliquer sur Supprimer, puis un autre après l'avoir cliqué, et que je sélectionne 'objets alloués entre les instantanés 1 et 2' (comme suggéré dans son article), il y a encore plus de 2000 objets présents. Il y a par exemple 4 entrées 'HTMLButtonElement', ce qui n'a pas de sens pour moi. Vraiment, je n'ai aucune idée de ce qui se passe.
3 votes
Doh, cela ne semble pas particulièrement utile. Il se peut qu'avec un langage à ramasse-miettes comme JavaScript, vous ne soyez pas vraiment censé vérifier ce que vous faites avec la mémoire à un niveau aussi granulaire que celui de votre test. Une meilleure façon de vérifier les fuites de mémoire pourrait être d'appeler
main
10 000 fois au lieu d'une seule, et de voir si vous finissez avec beaucoup plus de mémoire utilisée à la fin.3 votes
@PaulD.Waite Oui, peut-être. Mais il me semble que j'aurais quand même besoin d'une analyse à un niveau granulaire pour déterminer exactement quel est le problème, plutôt que de simplement pouvoir dire (ou ne pas dire) : "D'accord, il y a un problème de mémoire quelque part ici". Et j'ai l'impression que je devrais pouvoir utiliser leur profileur à un tel niveau granulaire... Je ne sais juste pas comment :(
0 votes
Vous devriez jeter un œil à youtube.com/watch?v=L3ugr9BJqIs