web-dev-qa-db-fra.com

Comment libérer de la mémoire en JavaScript

Je travaille avec canvas et son objet ImageData, qui contient une énorme quantité de données (des millions d'entiers). Donc, travailler avec quelques baies requiert déjà beaucoup de mémoire (jusqu'à 300 Mo). Existe-t-il un moyen de libérer la mémoire d'un tableau lorsqu'il est inutile? J'essaie d'assigner undefined à cette variable. Est ce juste?

63
haynar

Si la variable persiste (par exemple, qu'elle soit globale ou qu'elle fait partie d'une structure de données persistante) et que les données pointées sont volumineuses et que vous souhaitez que ces données soient éligibles pour le garbage collection, vous avez alors raison d'affecter quelque chose de petit à cette variable. undefined ou null ou "" tout fonctionnera. Ce que vous faites, c'est effacer la référence aux données volumineuses pour qu'elles soient éligibles pour la récupération de place. Si rien dans votre javascript ne contient de référence à ces données, elles peuvent être libérées par le ramasse-miettes. Si quelque chose d'autre y fait référence, il ne peut pas être libéré.

Par exemple, si vous avez un tableau de 10 000 éléments dans une variable globale:

var largeDataArray = new Array(10000);

Et, vous avez rempli la plupart des éléments avec des données, vous pouvez alors autoriser cette mémoire à être éligible pour le garbage collection en lui attribuant une autre valeur, telle que:

largeDataArray = null;

ou si vous voulez toujours que ce soit un tableau:

largeDataArray = [];

Remarque: les variables qui sortent du cadre (comme les variables locales dans les fonctions qui ne font pas partie d'une fermeture durable) ou les objets dans les objets qui sortent du domaine ne doivent pas nécessairement être effacées manuellement. Lorsqu'elles sortent de la portée ou que l'objet parent est supprimé, les données qu'il contient seront également éligibles pour le garbage collection.

Ainsi, l'effacement d'une variable ne doit être effectué que lorsque vous souhaitez explicitement libérer des données conservées dans une variable de longue durée et il est généralement utile de vous en préoccuper lorsque les données sont volumineuses ou si vous en avez beaucoup à ajouter. jusqu'à plusieurs mégaoctets de données (l'utilisation de la mémoire est plus importante à des niveaux moins élevés sur les smartphones que sur les navigateurs de bureau).

103
jfriend00

JavaScript a une gestion automatique de la mémoire. La mémoire contenant des objets qui ne sont plus référencés sera éligible pour la récupération de place, sauf en cas de fuite de mémoire. Il n'est généralement pas nécessaire d'affecter manuellement undefined à des variables.

Si votre programme utilise trop de mémoire, vous devriez réduire les tableaux pour vous débarrasser des éléments dont vous n’avez plus besoin. Voir Array.pop , Array.shift , et Array.splice .

4
Matt Ball