11
votes

Calcul de l'octet de l'objet Java

Je travaille sur calculaitng la taille [mémoire utilisée] d'un objet java [hashmap]. Il contient des éléments de différents types de données [lors de l'exécution] pour [taille de l'élément-no-de-élém *] n'est pas bonne approche. Le code qu'il fait en ce moment par la série de

if (x)
  do something
else if (primitives)
  lookup size and calculate


3 commentaires

Qu'est-ce que exactement voulez-vous dire par taille? Quantité de mémoire prise? Nombre d'éléments contenus?


par taille, je veux dire la quantité de mémoire prise .. Édition pour refléter que


Question plus ou moins identique: Stackoverflow.com/Questtions/757300/...


3 Réponses :


4
votes

Utilisez GetObjectsize () Méthode de l'emballage d'instrumentation.

look Voici pour la mise en œuvre Détails:


1 commentaires

Thnx



2
votes

La taille sérialisée n'est définitivement pas la voie à suivre, pour deux raisons:

  • Dans la sérialisation java standard, il peut y avoir beaucoup de frais généraux qui ajouteraient à la taille.
  • Il ne serait pas plus rapide que d'utiliser GetObjectsize () Méthode que nous pouvons supposerez-nous sur toutes les références et utilisez une sorte de recherche pour déterminer la taille des valeurs primitives / références de un objet.

    Si vous avez besoin de meilleures performances, cela dépendra vraiment de la distribution de vos objets. Une possibilité serait de faire un échantillonnage aléatoire des valeurs sur votre carte, de déterminer une moyenne et de calculer une estimation de cette valeur.

    Pour obtenir des conseils sur la recherche d'une valeur aléatoire dans un hashmap, voir cette question .


1 commentaires

Thnx..random Sampling peut être très inexact car la valeur de la carte de hachage peut différer de la taille jusqu'à une large mesure.



2
votes

Vous pouvez être intéressé par un article que j'ai écrit il y a quelque temps sur Comment calculer la mémoire Utilisation d'un objet Java . Il est certes visé principalement au point d'accès 32 bits, bien qu'il s'agisse d'une grande partie de celle-ci.

Vous pouvez également télécharger un simple Agent pour mesurer la taille d'objet Java du même site qui prendra une partie du travail acharné pour vous et devrait travailler dans des environnements 64 bits.

Remarque Comme d'autres, je pense que cela a mentionné que la forme sérialisée d'un objet n'est pas identique à sa forme en mémoire, l'utilisation de sérialisation ne convient pas si vous souhaitez mesurer l'empreinte de mémoire avec précision.


0 commentaires