Je veux connaître la taille occupée par un objet JavaScript.
Prenez la fonction suivante:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Maintenant, j'instancie le student
:
var stud = new Student();
pour que je puisse faire des trucs comme
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
etc.
Maintenant, l' stud
objet occupera une certaine taille en mémoire. Il contient des données et d'autres objets.
Comment savoir combien de mémoire l’ stud
objet occupe? Quelque chose comme un sizeof()
en JavaScript? Ce serait vraiment génial si je pouvais le découvrir en un seul appel de fonction comme sizeof(stud)
.
Je recherche sur Internet depuis des mois - je ne l'ai pas trouvé (demandé dans quelques forums - pas de réponse).
javascript
memory
object
sizeof
user4642212
la source
la source
Réponses:
J'ai refactorisé le code dans ma réponse d'origine . J'ai supprimé la récursivité et supprimé la surcharge d'existence supposée.
la source
"よんもじ".length
est 4 en Javascript, mais êtes-vous sûr que c'est 8 octets, comme votre code le renvoie?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
-b
contient ici une référence àa
, maisroughSizeOfObject()
retourne0
.Google Chrome Heap Profiler vous permet d'inspecter l'utilisation de la mémoire des objets.
Vous devez pouvoir localiser l'objet dans la trace, ce qui peut être délicat. Si vous épinglez l'objet à la fenêtre globale, il est assez facile à trouver à partir du mode de liste "Contention".
Dans la capture d'écran ci-jointe, j'ai créé un objet appelé "testObj" sur la fenêtre. Je l'ai ensuite localisé dans le profileur (après avoir fait un enregistrement) et il montre la pleine taille de l'objet et tout ce qu'il contient sous "taille retenue".
Plus de détails sur les pannes de mémoire .
Dans la capture d'écran ci-dessus, l'objet affiche une taille conservée de 60. Je pense que l'unité est ici en octets.
la source
comparison
vue en bas. Il rend évident quels objets ont été créés entre les deux instantanés.Shallow size
semble que 40 pour les deux{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
et les{ c:null, d:undefined }
objets. Est-ce que c'est bon?node --inspect
et dans Chrome, entrezabout:inspect
dans la barre d'URL et recherchez l'ouverture de l'inspecteur de nœud. Créez votre objet dans la CLI du nœud, puis prenez un instantané de segment de mémoire.Je viens d'écrire ceci pour résoudre un problème similaire (ish). Il ne fait pas exactement ce que vous cherchez, c'est-à-dire qu'il ne prend pas en compte la façon dont l'interpréteur stocke l'objet.
Mais, si vous utilisez V8, cela devrait vous donner une approximation assez correcte, car le génial prototypage et les classes cachées lèchent la majeure partie de la surcharge.
la source
Parfois, j'utilise ceci pour signaler de très gros objets qui pourraient être envoyés au client depuis le serveur. Il ne représente pas l'empreinte mémoire. Il vous donne juste environ ce qu'il en coûterait pour l'envoyer ou le stocker.
Notez également que c'est lent, uniquement pour les développeurs. Mais pour obtenir une réponse approximative avec une seule ligne de code, cela m'a été utile.
la source
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( toujours utile cependantVoici une solution légèrement plus compacte au problème:
la source
typeof ...
cela ne fonctionnerait pas.Il existe un module NPM pour obtenir la taille de l'objet , vous pouvez l'installer avec
npm install object-sizeof
la source
C'est une méthode hacky, mais je l'ai essayée deux fois avec des nombres différents et elle semble cohérente.
Ce que vous pouvez faire est d'essayer d'allouer un grand nombre d'objets, comme un ou deux millions d'objets du type que vous souhaitez. Mettez les objets dans un tableau pour empêcher le garbage collector de les libérer (notez que cela ajoutera une légère surcharge de mémoire à cause du tableau, mais j'espère que cela ne devrait pas avoir d'importance et d'ailleurs si vous allez vous inquiéter que des objets soient en mémoire , vous les stockez quelque part). Ajoutez une alerte avant et après l'allocation et vérifiez à chaque alerte la quantité de mémoire nécessaire au processus Firefox. Avant d'ouvrir la page avec le test, assurez-vous d'avoir une nouvelle instance de Firefox. Ouvrez la page, notez l'utilisation de la mémoire après l'affichage de l'alerte "avant". Fermez l'alerte, attendez que la mémoire soit allouée. Soustrayez la nouvelle mémoire de l'ancienne et divisez-la par le nombre d'allocations.
J'ai essayé cela sur mon ordinateur et le processus avait 48352 Ko de mémoire lorsque l'alerte "avant" a été affichée. Après l'allocation, Firefox avait 440236 Ko de mémoire. Pour 2 millions d'allocations, cela représente environ 200 octets pour chaque objet.
Je l'ai essayé à nouveau avec 1 million d'allocations et le résultat était similaire: 196 octets par objet (je suppose que les données supplémentaires dans 2mill ont été utilisées pour Array).
Alors, voici une méthode hacky qui pourrait vous aider. JavaScript ne fournit pas de méthode "sizeof" pour une raison: chaque implémentation JavaScript est différente. Dans Google Chrome par exemple, la même page utilise environ 66 octets pour chaque objet (à en juger par le gestionnaire de tâches au moins).
la source
Désolé, je n'ai pas pu commenter, je continue donc le travail de tomwrong. Cette version améliorée ne comptera pas les objets plus d'une fois, donc pas de boucle infinie. De plus, je pense que la clé d'un objet doit également être comptée, en gros.
la source
typeof value === 'object'
ne suffit pas et vous aurez des exceptions si la valeur estnull
.level
contient des données maisroughSizeOfObject(level)
renvoie zéro. (Mon niveau de variable ne doit pas être confondu avec votre argument, bien sûr. Je ne pense pas que l'observation des variables devrait causer un problème ici, et aussi lorsque je renomme le 'niveau' dans votre script, j'obtiens le même résultat.) Capture d'écran : snipboard.io/G7E5yj.jpgAyant le même problème. J'ai cherché sur Google et je souhaite partager avec la communauté stackoverflow cette solution.
Important :
Qu'est-ce que tu en penses?
la source
Suite à ce commentaire, voici ce que vous devez faire: Essayez de produire un problème de mémoire - Écrivez du code qui crée tous ces objets et augmentez grossièrement la limite supérieure jusqu'à ce que vous rencontriez un problème (crash du navigateur, gel du navigateur ou un out-of- erreur de mémoire). Idéalement, vous devriez répéter cette expérience avec différents navigateurs et différents systèmes d'exploitation.
Maintenant, il y a deux options: option 1 - Vous n'avez pas réussi à produire le problème de mémoire. Par conséquent, vous vous inquiétez pour rien. Vous n'avez pas de problème de mémoire et votre programme va bien.
option 2 - vous avez eu un problème de mémoire. Demandez-vous maintenant si la limite à laquelle le problème s'est produit est raisonnable (en d'autres termes: est-il probable que cette quantité d'objets soit créée lors d'une utilisation normale de votre code). Si la réponse est «non», alors ça va. Sinon, vous savez maintenant combien d'objets votre code peut créer. Retravaillez l'algorithme de sorte qu'il ne dépasse pas cette limite.
la source
Si votre principale préoccupation est l'utilisation de la mémoire de votre extension Firefox, je vous suggère de vérifier avec les développeurs Mozilla.
Mozilla fournit sur son wiki une liste d'outils pour analyser les fuites de mémoire .
la source
Cette bibliothèque Javascript
sizeof.js
fait la même chose. Incluez-le comme ceciLa fonction sizeof prend un objet comme paramètre et renvoie sa taille approximative en octets. Par exemple:
La fonction sizeof peut gérer des objets qui contiennent plusieurs références à d'autres objets et des références récursives.
Publié à l'origine ici .
la source
Les outils de développement Chrome ont cette fonctionnalité. J'ai trouvé cet article très utile et fait exactement ce que vous voulez: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
la source
Un grand merci à tous ceux qui ont travaillé sur le code pour cela!
Je voulais juste ajouter que je cherchais exactement la même chose, mais dans mon cas, c'est pour gérer un cache d'objets traités pour éviter d'avoir à ré-analyser et traiter des objets d'appels ajax qui peuvent ou non avoir été mis en cache par le navigateur. Ceci est particulièrement utile pour les objets qui nécessitent beaucoup de traitement, généralement tout ce qui n'est pas au format JSON, mais il peut être très coûteux de garder ces choses en cache dans un grand projet ou une application / extension qui reste en cours d'exécution pendant une longue période. temps.
Quoi qu'il en soit, je l'utilise pour quelque chose comme:
C'est un exemple simpliste et peut contenir des erreurs, mais il donne l'idée, car vous pouvez l'utiliser pour conserver des objets statiques (le contenu ne changera pas) avec un certain degré d'intelligence. Cela peut réduire considérablement les exigences de traitement coûteuses que l'objet devait être produit en premier lieu.
la source
la source
J'utilise l' onglet Chronologie des outils de développement Chrome , instancie de plus en plus de grandes quantités d'objets et obtient de bonnes estimations comme ça. Vous pouvez utiliser du HTML comme celui-ci ci-dessous, comme passe-partout, et le modifier pour mieux simuler les caractéristiques de vos objets (nombre et types de propriétés, etc ...). Vous souhaiterez peut-être cliquer sur l'icône de corbeille en bas de cet onglet d'outils de développement, avant et après une exécution.
L'instanciation de 2 millions d'objets d'une seule propriété chacun (comme dans ce code ci-dessus) conduit à un calcul approximatif de 50 octets par objet, sur mon Chrome, en ce moment. Changer le code pour créer une chaîne aléatoire par objet ajoute environ 30 octets par objet, etc. J'espère que cela vous aidera.
la source
Si vous devez vérifier par programme pour aprox. taille des objets, vous pouvez également consulter cette bibliothèque http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/ que j'ai pu utiliser pour la taille des objets.
Sinon, je suggère d'utiliser le profileur de tas Chrome / Firefox.
la source
Je crois que vous avez oublié d'inclure «tableau».
la source
Je sais que ce n'est absolument pas la bonne façon de le faire, mais cela m'a aidé à plusieurs reprises dans le passé à obtenir la taille approximative du fichier objet:
Écrivez votre objet / réponse dans la console ou un nouvel onglet, copiez les résultats dans un nouveau fichier de bloc-notes, enregistrez-le et vérifiez la taille du fichier. Le fichier du bloc-notes lui-même ne fait que quelques octets, vous obtiendrez donc une taille de fichier objet assez précise.
la source