web-dev-qa-db-fra.com

Javascript et collecte des ordures

Existe-t-il un moyen de contrôler le moment où Javascript effectue la récupération de place? Je voudrais lui permettre d'effectuer la collecte des ordures à certains moments pour assurer le bon fonctionnement de mon site Web

43
Ed Heal

Javascript n'a pas de gestion de mémoire explicite, c'est le navigateur qui décide quand le nettoyer. Parfois, il peut arriver que vous rencontriez un rendu non fluide de JavaScript en raison d'une pause de récupération de place.

Il existe de nombreuses techniques que vous pouvez appliquer pour surmonter les problèmes causés par la récupération de place (GC). Plus vous appliquez, plus vous explorez. Supposons que vous ayez un jeu écrit en JavaScript et que chaque seconde que vous créez un nouvel objet, il est évident qu'après un certain laps de temps, GC se produira pour libérer de l'espace pour votre application.

Pour les applications en temps réel comme les jeux, qui nécessitent beaucoup d'espace, la chose la plus simple que vous pouvez faire est de réutiliser la même mémoire. Cela dépend de la façon dont vous structurez votre code. S'il génère beaucoup de déchets, il peut donner une expérience saccadée.

En utilisant des procédures simples: C'est bien connu que le nouveau mot-clé indique l'allocation. Dans la mesure du possible, vous pouvez essayer de réutiliser le même objet à chaque fois en ajoutant ou en modifiant des propriétés. Ceci est également appelé recyclage de l'objet

Dans le cas des tableaux, l'attribution de [] est souvent utilisée pour effacer le tableau, mais vous devez garder à l'esprit qu'il crée également un nouveau tableau et détruit l'ancien. Pour réutiliser le même bloc, vous devez utiliser arr.length = 0 Cela a le même effet mais il réutilise le même objet tableau au lieu d'en créer un nouveau.

En cas de fonctions: Parfois, notre programme avait besoin d'appeler une fonction spécifique plus de temps ou à certains intervalles en utilisant setInterval ou setTimeout.

ex: setTimeout(function() { doSomething() }, 10);

Vous pouvez optimiser le code ci-dessus en affectant la fonction à une variable permanente plutôt que d'apparaître à chaque fois à intervalles réguliers.

    ex : var myfunc = function() { doSomething() }
    setTimeout(myfunc, 10);

Une autre chose possible est que la méthode array slice () retourne un nouveau tableau (basé sur une plage du tableau d'origine, qui peut rester intacte), la chaîne de substr renvoie également une nouvelle chaîne (basée sur une plage de caractères dans la chaîne d'origine , qui peut rester intacte), etc. L'appel de ces fonctions crée des ordures s'il n'est pas réutilisé correctement.

Pour éviter complètement les déchets en JavaScript, c'est très difficile, on pourrait dire impossible. Cela dépend de la façon dont vous réutilisez les objets et les variables pour éviter les ordures. Si votre code est bien structuré et optimisé, vous pouvez minimiser les frais généraux.

75
Shadow

Malheureusement, il n'y a aucun moyen de contrôler QUAND la collecte des ordures a lieu, mais avec la bonne formation des objets, vous POUVEZ contrôler la rapidité et la propreté. Jetez un oeil à ces documents sur Mozilla Dev Net .

Cet algorithme suppose la connaissance d'un ensemble d'objets appelés racines (en JavaScript, la racine est l'objet global). Périodiquement, le garbage collector partira de ces racines, trouvera tous les objets référencés à partir de ces racines, puis tous les objets référencés à partir de celles-ci, etc. A partir des racines, le garbage collector trouvera ainsi tous les objets accessibles et collectera tous les non objets accessibles.

Cet algorithme est meilleur que le précédent car "un objet a une référence nulle" conduit à ce que cet objet soit inaccessible. L'inverse n'est pas vrai comme nous l'avons vu avec les cycles.

5
DevlshOne

Pourquoi ne pas garder des références à tous vos objets jusqu'à ce que vous vouliez qu'ils soient GC'd?

var delayed_gc_objects = [];
function delayGC(obj) { // keeps reference alive
    return delayed_gc_objects[delayed_gc_objects.length] = obj;
}
function resumeGC() { // kills references, letting them be GCd
    delayed_gc_objects.length = 0;
}
2
Paul S.

vous pouvez effectuer certaines modifications pour améliorer votre utilisation de la mémoire, comme:

  1. ne définissez pas de variables sur les boucles
  2. évitez d'utiliser des variables et des fonctions globales. ils prendront un morceau de mémoire jusqu'à ce que vous sortiez
0
Jean Carlos

JavaScript est un langage récupéré, ce qui signifie que l'environnement d'exécution est responsable de la gestion de la mémoire requise lors de l'exécution du code. La forme la plus populaire de récupération de place pour JavaScript est appelée mark-and-sweep. Un deuxième type de récupération de place moins populaire est le comptage de références. L'idée est que chaque valeur garde une trace du nombre de références qui y sont faites

GC suit ces algo, même si vous parvenez à déclencher le GC, il ne sera pas garanti qu'il fonctionnera immédiatement, vous le marquez seulement

0
anish