2010-10-21 21 views
11

Je travaille sur le calcul de la taille [mémoire utilisée] d'un objet java [hashmap]. Il contient des éléments de types de données différents [lors de l'exécution] donc [no-of-elem * size-of-element] n'est pas une bonne approche. Le code le fait maintenant par série deCalcul de la taille de l'octet de l'objet Java

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

Cependant, ce processus est un CPU hog et inefficace.

Je pense à la suite 2 approches à la place:

  1. sérialiser l'objet d'un tampon et obtenir la taille.
  2. Regardez dans java.lang.instrument pour obtenir la taille

Je cherche anyones expérience avec ces approches pour la performance, l'efficacité, l'échelle etc ou si vous connaissez quelque façon meilleure.

P.S: Ceci est un utilitaire de fond que je construis donc la taille ne doit pas être super précise, mais il devrait être sur la bonne. Je suis donc prêt à échanger la précision des performances

Je ne suis pas intéressé par la profondeur de taille [la taille des objets qui sont refered par cet objet ne sera pas calculé.]

Je cherche une comparaison des performances et comprendre comment getObjectSize() fonctionne ..so en interne que je ne messup quelque chose d'autre pour améliorer les performances

Merci

+0

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

+0

par taille, je veux dire la quantité de mémoire prise .. édition pour refléter cela – codeObserver

+1

Question plus ou moins identique: http://stackoverflow.com/questions/757300/programatically-calculate-memory-occupied-by-a-java- object-including-objects-it-r – andersoj

Répondre

4

Utilisez la méthode getObjectSize() du paquet Instrumentation.

Regardez here pour les détails de mise en œuvre:

+0

thnx .. Je suis à la recherche d'une comparaison des performances et de la compréhension de comment getObjectSize() fonctionne en interne .. afin que je ne dérange pas autre chose pour améliorer les performances // même si je pense que getObjectSize est mon Meilleure option. – codeObserver

2

La taille sérialisé est certainement pas la voie à suivre, pour deux raisons:

  • Dans la sérialisation Java standard il peut y avoir beaucoup de frais généraux qui serait ajouter à la taille
  • Il ne serait pas plus rapide que d'utiliser la méthode getObjectSize() que l'on peut supposer parcourir toutes les références, et d'utiliser une sorte de recherche pour déterminer la taille des valeurs/références primitives d'un objet.

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

Pour obtenir des conseils sur la façon de rechercher une valeur aléatoire dans un hashmap, voir question.

+0

Thnx..L'échantillonnage aléatoire peut être très imprécis car la valeur de la carte de hachage peut être très différente. – codeObserver

2

Vous pouvez être intéressé par un article que j'ai écrit il y a un article sur how to calculate the memory usage of a Java object. Il est certes destiné principalement à Hotspot 32 bits, bien que cela s'applique en grande partie à d'autres environnements.

Vous pouvez également télécharger un simple agent for measuring Java object size à partir du même site, ce qui vous enlèvera un peu de travail et devrait fonctionner dans les environnements 64 bits.Remarque que d'autres ont je pense mentionné que la forme sérialisée d'un objet n'est pas la même que sa forme en mémoire, donc l'utilisation de la sérialisation ne convient pas si vous voulez mesurer l'empreinte de la mémoire avec précision.