2011-07-04 2 views
1

Plaine question stupide. J'ai une collection qui contient des objets Java. Ces objets ne sont pas des instances de la même classe, mais ils implémentent la même interface et conceptuellement très "semblables", de sorte que leurs tailles devraient être assez similaires. J'ai besoin de comprendre approximativement combien d'espace cette collection consommera dans la mémoire. Quelle serait la méthode la plus facile (la meilleure) pour calculer cela? Je comprends que je peux prendre chaque classe java qui peut résider en collection, calculer leur taille (taille profonde, Réflexion, etc.), obtenir la moyenne, multiplier par N (taille de la collection) et obtenir la valeur finale.meilleure façon de mesurer l'empreinte des objets java en mémoire

Mais est-ce que cela peut être fait dans l'autre sens - en calculant la taille de la collection existante (sans plonger dans la réflexion, la taille des champs, etc.)? Je comprends que la sérialisation de la collection en flux octet et mesuring la taille de sortie ne fonctionnera pas parce que la sérialisation ne reflétera pas la disposition exacte de la mémoire de l'objet. Mais peut-être y a-t-il d'autres façons de le faire?

+1

Notez que les différentes JVM ne peuvent pas utiliser la même taille pour un objet donné. –

+0

Il est peu probable que la même machine virtuelle Java avec des références de taille différente utilise la même quantité de mémoire. –

Répondre

1

Si vous utilisez un profileur comme YourKit, il peut vous indiquer la taille profonde d'un objet. Vous pouvez utiliser Instrumentation.getObjectSize() mais c'est une vraie peine à utiliser (et cela vous donne seulement la taille peu profonde)

La meilleure approche peut être de l'estimer/calculer vous-même. Ajouter la taille de chacun des champs (arrondir aux 8 octets suivants) ajouter 12 octets de surcharge par objet ou 16 octets si vous utilisez une JVM 64 bits et Compresses Oops est désactivé.

+0

@Peter ne dépend pas au moins sur le bitness de la VM? Et je pensais que la VM Hotspot avait un overhead de 3 mots par objet – Voo

+0

@Voo, je pense que vous avez raison. La surcharge est plus proche de 12 octets. La dernière version de JVM utilise des oops compressés par défaut sur les fenêtres, donc ses 12 octets sur les JVM 32 bits et 64 bits. –

+0

@didxga, Comment pouvez-vous utiliser JMeter pour obtenir la taille d'un objet? –

Questions connexes