10
votes

Disposer un objet image

Lors de la création d'un nouvel élément d'image dans JavaScript, l'outil de mémoire de Google Chrome (Outils de développement> Timeline> Memine) le considère comme un nouvel élément DOM, naturellement.

Dans mon cas, je me limite avec 1500+ Dom éléments, et je souhaite me débarrasser d'eux. J'ai essayé de sauvegarder tous les objets dans un tableau et de les supprimer toutes dans une boucle lorsque je suis prêt à créer tous les objets, ce qui permet d'obtenir l'erreur suivante:

Company TypeError: impossible d'appeler la méthode ' removechild 'de null

qui indique que les objets d'image n'apparaissent pas dans le DOM réel. xxx

y a-t-il un façon de supprimer / supprimer / non défini / jetez les objets d'image?


0 commentaires

5 Réponses :


6
votes

Si vous ne les ajoutez pas au DOM (comme à l'aide de appendicchild à un parent), alors removechild est inutile. Les objets d'image ne sont que dans la mémoire.

et pour éliminer les éléments de la mémoire, il vous suffit de retirer les références à ces objets (comme définir la variable de référencement à NULL) et la collecte des ordures fera le reste. Si vous ne pouvez pas tous les nuler, ils ne seraient pas GC'ed.


1 commentaires

Juste curieux, si vous avez NULL, l'objet sera techniquement enlever la mémoire allouée de l'image après avoir été gc'd?



1
votes

Je pense que seuls le moyen est de le faire:

for( i = 0; i < images.length; i++ ) 
  images[i] = null;
}

// or just 
images = null;


0 commentaires

2
votes

afaik, attribution null doit le nettoyer: images [i] = null


0 commentaires

12
votes

paramètre images = null code> supprimerait votre référence en code à l'objet. Cependant, pour mettre en œuvre son événement code> code>, Chrome doit avoir sa propre référence interne à l'objet.

C'est-à-dire que vous pourriez avoir du code comme celui-ci: p> xxx pré>

De cette façon, vous obtiendrez toujours beaucoup d'alertes "tester", même si vous n'avez pas de référence à ces objets. p>

Par conséquent, mon devinez em> est qu'il s'agit d'un bogue en chrome, pas dans votre code. p>

mise à jour: regarder à travers la source du chrome Sorte de prouve que (je veux dire le commentaire sur les lignes 67-71 de ce fichier, notamment la note Fixme http://code.google.com/searchFrame#oamlx_jo-ck/src/third_party/webkit/source/webcore/bindings/v8/custom /V8htmlimageelementConstructeur.cpp ): P>

// Make sure the document is added to the DOM Node map. Otherwise, the HTMLImageElement instance
// may end up being the only node in the map and get garbage-ccollected prematurely.
// FIXME: The correct way to do this would be to make HTMLImageElement derive from
// ActiveDOMObject and use its interface to keep its wrapper alive. Then we would
// remove this code and the special case in isObservableThroughDOM.


4 commentaires

Merci! Je sais que votre réponse a été la dernière fois, mais vous avez effectivement effectué des recherches


Cela a-t-il été réparé depuis ou s'agit-il d'un bug?


Ce n'est pas un bug! Vous avez ajouté un auditeur, mais n'a pas été supprimé. En faisant "image = null", vous ne retirez que cette référence concrète. L'objet existe toujours dans une mémoire, bien qu'aucune référence ne soit laissée. Pour laisser gs libérer, vous devez supprimer l'événement par "image.onload = null"


@shal est absolument juste. Pas un bug! Vous avez juste besoin de nettoyer après vous-même pour permettre au collecteur des ordures de faire son travail. ! Parfois plus facile dit que fait!)



4
votes

Pour vous débarrasser du bug décrit par "Naivistes" de Chrome et Specilly Ie et Edge. Vous pouvez modifier la source d'image pour vider afin de prendre zéro mémoire.

image.src = '';
image = null;


0 commentaires