2009-08-26 6 views
4

Dans Windows, lorsqu'une application est minimisée, le système d'exploitation libère de la mémoire associée à l'application en plaçant les données dans un fichier de page. D'autres garbage collection peuvent également exécuter.Observation intéressante avec la gestion de la mémoire IE et javascript

Dans le cas d'Internet Explorer en cours d'exécution de mon application javascript, je trouve que si l'utilisation de la mémoire commence à 60mb puis minimisant le navigateur réduit la mémoire à 17mb. La maximisation le ramène alors à 40mb

Un gain de 20mb.

Mon application fait un usage intensif de javascript et je soupçonne que IE est en train de forcer une collection de garabage des objets qui ne sont plus référencés.

Via javascript (IE uniquement) vous pouvez forcer la collecte des ordures via:

CollectGarbage() 

Donc, si je l'appelle cette méthode (sans minimiser l'écran) Je Reclaim seulement meg ou 2.

Si J'appelle cela via la file d'attente:

setTimeout(CollectGarbage, 1000) 

Je réapproprier environ 3 meg

Mon application Lication est conçue pour fonctionner toute la journée et la gestion de la mémoire est donc très importante.

Quelqu'un at-il des idées pour forcer IE à nettoyer sa mémoire dans la même mesure qu'une minise manuelle?

Les suggestions de minimisation de la programmation du navigateur seront moquées!

cheers :)

+0

Votre application utilise-t-elle des bibliothèques ou des frameworks particuliers par hasard? –

Répondre

1

Utilisez le mot-clé delete à la variable annuler la définition/propriété, vous permet d'économiser la mémoire. More here.

Mais si vous avez seulement besoin de perdre une référence à une propriété d'objet, placez-la simplement sur null et attendez la prochaine collecte.

Soyez prudent en utilisant les fermetures et les fonctions lambda, car ils ont traditionnellement été des porcs mémoire et des sources de fuites. Voir Understanding and Solving Internet Explorer Leak Patterns.

+1

delete supprime la propriété d'un prototype et par conséquent supprime la référence. obj.prop = null supprime simplement la référence. Donc, dans le cas d'une suppression si vous deviez parcourir les propriétés d'obj, vous constateriez que le nombre de propriétés sera réduit. Dans le cas de obj.prop = null, le nombre de propriétés reste le même. La différence entre ces approches n'est pas significative du point de vue de la mémoire, mais elles sont sémantiquement assez différentes. – iasksillyquestions

+0

Le doc Mozilla que vous avez lié dans votre réponse dit explicitement que «supprimer» n'a rien à voir avec la libération de la mémoire ... –

+1

Hey @MikeYoung, merci pour le commentaire conflictuel 7 ans plus tard. Je vais être gentil et expliquer la logique de toute façon. Oui, je sais que «supprimer» ne libère pas la mémoire tout seul. Je sais ce qu'est la collecte des ordures et comment cela fonctionne. Je dirai même que je savais ce que c'était il y a 7 ans. Cette collection d'ordures est ce que je suis après. Si vous avez 'obj ['foo'] = expensiveObj', la suppression de '' foo'' supprime une référence.En supposant que c'est la seule référence, vous avez fait de votre mieux pour que cette mémoire soit libérée lors du prochain balayage. – geowa4

Questions connexes