Forcer la collecte des ordures dans Google Chrome
Nous développons une seule page web app avec ZK qui constamment communique avec le serveur et les mises à jour des parties de ses écrans. Mise à jour peut être aussi fréquentes que 1s. Au cours de ces mises à jour, des références à de grandes quantités de JS objets sont perdus et ces objets doivent être nettoyés par le garbage collector finalement.
Aussi loin que nous l'avons compris, Chrome ne fonctionne que son garbage collector sur onglets inactifs. C'est un problème pour nous, car l'application de l'onglet est généralement actif et presque jamais actualisée, ainsi JS objets jamais obtenir recueillies. Si elle reste active pendant un temps suffisant, l'onglet finalement se bloque (Oh Snap message).
Nous avons besoin de procéder à la collecte des ordures manuellement. Jusqu'à présent, nous avons essayé de lancer google Chrome avec --js-flags="--expose-gc"
et en cours d'exécution gc()
, mais il déclenche une exception:
ReferenceError: gc is not defined
Ce n'est pas le cas sur Firefox -- l'utilisation de la mémoire est plus ou moins constante.
La Force de l'actualisation de la page n'est pas une option.
Nous vous serions reconnaissants pour toute et toutes les suggestions.
MODIFIER: nous avons essayé de courir window.gc()
et gc()
à la fois sur Chrome versions 23.0.1271.97 m
et 25.0.1364.2 dev-m
- "Aussi loin que nous l'avons compris, Chrome ne fonctionne que son garbage collector sur onglets inactifs" Non, c'est incorrect. Chrome va exécuter le GC à chaque fois qu'il sent qu'il doit, si l'onglet est actif ou non.
- Avez-vous essaye à l'aide du JavaScript
delete
? - C'est la fenêtre.gc() mais ce n'est pas la solution ultime, car autant que je sache, il ne fonctionne que sur les versions de débogage de Chrome. Comme Crowder a souligné Chrome exécuter en cas de besoin donc, si votre application fuites de mémoire, puis ce que vous devriez revoir votre code pour libérer explicitement les objets alloués à chaque fois que possible.
delete
n'a rien à voir avec la gestion de la mémoire en JavaScript, à l'exception purement comme un effet secondaire s'il vous arrive de l'utiliser pour supprimer une propriété qui est le seul suspens référence à un objet.- Oui, je sais que le
delete
n'est pas nécessairement déclencher gc, mais il pourrait aider dans le nettoyage des objets, manuellement. Je devrais peut-être avons élaboré un peu. - Tout en évitant que le mythe continue à être prepetuated (wow Brendan doit avoir appelé
remove
ou quelque chose, mais bon, il était sous une énorme pression de temps...). - Nous avons trouvé un problème dans code.google.com, où les utilisateurs affirment aussi que le GC ne se produira pas à moins que l'onglet est rendu inactif (7 commentaires). Il est résolu que WontFix. Le plus probablement devrait fonctionner comme vous l'avez décrit, mais pour une raison qui ne fonctionne pas.
- Je n'interprète pas ce thread de cette façon, je l'interpréter comme quelqu'un qui me dit que la mémoire n'est pas libérée dès qu'ils pensent qu'il devrait être, et que quelqu'un en disant qu'ils pensent qu'ils peuvent causer de l'Aw clin d'oeil! mais la fourniture de zéro de données à l'appui pour que. Clairement si vous pouviez plantage de Chrome en faisant glisser les images à plusieurs reprises, ce ne serait pas une WontFix situation.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez récupérer le code de Chrome Dev Tools, de le modifier, de sorte que
ProfilerAgent.collectGarbage();
est appelée à chaque maintenant et puis (c'est un code qui est appelé lorsque vous cliquez sur "Collecter les Ordures" bouton sur le panneau Montage) et exécutez google Chrome avec votre version de DevTools à l'aide de--debug-devtools-frontend
drapeau.Cependant, cette solution est assez extrême, essayez seulement quand vous obtenez vraiment désespéré. Jusqu'alors, je propose de profilage de votre application et de vérification pourquoi v8 décide de ne pas nettoyer la poubelle (ou ne pouvez pas nettoyer la poubelle). Panneau montage de DevTools va vous aider avec ceci. Commencez par vérifier si "ramasser les Ordures" bouton au bas de ce panneau fait vraiment de son travail, si ce n'est pas vous avez probablement une fuite de mémoire (au moins, selon v8). Si oui, essayez de fuite-finder-pour-javascript.
[MODIFIER] j'ai enlevé infos sur l'extension chrome, comme il s'avère que
gc()
peut être appelée à partir de la page web le code lorsque--js-flags="--expose-gc"
est utilisé. Au moins sur mon 23.0.1271.64.--js-flags
. Maintenantgc()
semble fonctionner. La " ramasser les Ordures bouton fonctionne également. Merci, vous avez été d'un grand secours.En Chrome Developer Tools, vous avez "Timeline" de la section, à partir de autour de Chrome 53. vous avez là l'aspect du bouton de la Poubelle. en cliquant sur elle, et elle en forçant le garbage collector à exécuter.
Mise à jour:
La GC bouton déplacé à l'Onglet Performances dans les versions plus récentes de Chrome.
J'ai trouvé une solution. Apparemment Chrome fuites nœuds DOM, au moins dans la version actuelle (26.0.1410.65 droit maintenant)
J'ai enregistré outils de dev montage de mon application, et il a montré que les Écouteurs d'Événement compter de monter et descendre en cadence avec mon écran d'application du contenu, mais le Nœud DOM comte a été en constante augmentation au fil du temps, jusqu'à ce que la languette s'est écrasé.
J'ai essayé le dernier Chrome Canary (28.0.1500.3) et ils semblent avoir résolu le problème. Nœud DOM comte graphique suit le même rythme que les Écouteurs d'Événement.
La chose qui me surprend, c'est...pourquoi ne pas gmail jamais accident? J'ai l'habitude de garder un onglet ouvert pendant des semaines à la fois...