Forcer la collecte des ordures dans Google Chrome
Nous développons une application web d'une seule page avec ZK qui communique en permanence avec le serveur et met à jour certaines parties de ses écrans. La mise à jour peut être aussi fréquente que 1s. Au cours de ces mises à jour, les références à de grandes quantités d'objets [~ # ~] js [~ # ~] sont perdues et ces objets doivent être nettoyés par le ramasse-miettes éventuellement.
Pour autant que nous ayons compris, Chrome exécute uniquement son garbage collector sur les onglets inactifs. C'est un problème pour nous, car l'onglet de l'application est généralement actif et presque jamais actualisé, donc [~ # ~] js [~ # ~] les objets ne sont jamais collectés. S'il reste actif pendant suffisamment de temps, l'onglet se bloque finalement ( Aww Snap message).
Nous devons lancer la collecte des ordures manuellement. Jusqu'à présent, nous avons essayé d'exécuter Chrome avec --js-flags="--expose-gc"
Et d'exécuter gc()
, mais cela lève une exception:
ReferenceError: gc is not defined
Cela ne se produit pas sur Firefox - l'utilisation de la mémoire est plus ou moins constante.
L'actualisation forcée de la page n'est pas une option.
Nous serions reconnaissants pour toutes les suggestions.
[~ # ~] éditer [~ # ~] : nous avons essayé d'exécuter window.gc()
et gc()
à la fois sur Chrome 23.0.1271.97 m
et 25.0.1364.2 dev-m
Vous pouvez récupérer le code de Chrome Dev Tools, modifiez-le pour que ProfilerAgent.collectGarbage();
soit appelé de temps en temps (c'est un code qui est appelé lorsque vous cliquez sur le bouton "Collect Garbage") sur le panneau Chronologie) et exécutez Chrome avec votre version de DevTools en utilisant l'indicateur --debug-devtools-frontend
.
Cependant, cette solution est assez extrême, essayez-la uniquement lorsque vous êtes vraiment désespéré. Jusque-là, je propose de profiler votre application et de vérifier pourquoi la v8 décide de ne pas nettoyer les ordures (ou ne peut pas nettoyer les ordures). Le panneau Chronologie de DevTools vous aidera avec cela. Commencez par vérifier si le bouton `` Collect Garbage '' au bas de ce panneau fait vraiment son travail, sinon - vous avez probablement une fuite de mémoire (au moins, selon la v8). Si oui, essayez fuite-Finder-for-javascript .
[ [~ # ~] modifier [~ # ~] ] J'ai supprimé les informations sur l'extension chrome, car elle tourne que gc()
peut être appelée à partir du code de page Web lorsque --js-flags="--expose-gc"
est utilisé. Au moins sur mon 23.0.1271.64.
Dans Chrome Outils de développement, vous avez la section "Chronologie", d'environ Chrome 53. votre bouton ressemble à une poubelle. En cliquant dessus et en forçant le garbage collector à exécuter.
Mise à jour:
Le bouton GC a été déplacé vers l'onglet Performances dans les versions plus récentes de Chrome.
J'ai trouvé une solution. Apparemment Chrome fuit les nœuds DOM, au moins dans la version actuelle (26.0.1410.65 en ce moment)
J'ai enregistré la chronologie des outils de développement dans mon application et cela montrait le nombre d'écouteurs d'événements qui montaient et descendaient rythmiquement avec le contenu de l'écran de mon application, mais le nombre DOM Node count augmentait régulièrement au fil du temps, jusqu'à ce que l'onglet écrasé.
J'ai essayé le dernier Chrome Canary (28.0.1500.3) et ils semblent avoir résolu le problème. DOM Node count graph suit maintenant le même schéma rythmique que le Écouteurs d'événements.
Ce qui m'attire, c'est ... pourquoi gmail ne plante-t-il jamais? Je garde généralement un onglet ouvert pendant des semaines à la fois ...