2010-08-31 3 views
2

Possible en double:
Is there any sizeof-like method in Java?Comment calculer la taille de la classe dans java ..? Est une méthode comme sizeof() dans c ..?

Je veux déterminer la taille de ma classe lors de l'exécution. En C je fais ceci:

struct 
{ 
int id; 
char name[30]; 
} registry 


void main() 
{ 
int size = sizeof(registry); 
} 

Comment puis-je faire cela en Java?

+1

qui est la taille de l'objet, non? pas la taille de la classe (avec le code d'octet pour les définitions de méthodes et autres) – Thilo

+1

Que voulez-vous faire avec les nombres? Il y mai être un moyen de faire ce que vous voulez sans avoir à connaître la taille explicite ... –

+0

Possible depuis Java 5 en utilisant java.lang.instrument.Instrumentation –

Répondre

1

Vous ne pouvez pas. La machine virtuelle Java ne veut pas que vous le sachiez.

Il y a probablement d'autres façons de faire ce que vous voulez vraiment faire avec cette information.

+0

ya je veux savoir comment calculer –

+0

Cette façon de parler, il semble étrange pour moi. Cela donne l'impression qu'ils sont méchants! :-) Je dirais: la conception de la JVM indique que les implémenteurs JVM sont autorisés à effectuer des optimisations qui sont activées en n'exposant pas la 'taille' des objets (ou même en ayant une constante par objet, ou au fil du temps). – Ken

1

Les machines virtuelles diffèrent dans la façon dont elles stockent les variables, etc. La plupart des machines virtuelles 32 bits sont similaires. Vous pouvez probablement estimer la taille peu profonde d'une instance de classe comme ceci:

sizeInBytes = C + 4 * (fieldCount) 

Où C est une constante. Ceci est dû au fait que tous les champs reçoivent généralement une largeur de mot qui est souvent de 4 octets en interne par rapport à la JVM. La taille profonde de la classe est plus difficile à calculer, mais fondamentalement, vous ajoutez récursivement la taille de chaque objet référent. Les tableaux sont généralement 1*arr.length octets de taille pour les booléens et les octets, 2*arr.length pour les caractères et les shorts, 4*arr.length pour les ints et les flotteurs, et 8*arr.length pour les doubles et les longs.

La manière la plus simple d'obtenir une estimation au moment de l'exécution consiste à mesurer la façon dont Runtime.freeMemory() change lorsque vous instanciez des objets de votre classe. Rien de tout cela ne devrait être utilisé pour la logique du programme bien sûr; juste pour peaufiner JVM ou la curiosité.

+0

'boolean' dans HotSpot VM est en fait 8 octets mais sinon tout cela est bon :) – Esko

+0

@Esko' boolean' est de huit __bytes__? – zneak

+0

... bits! Merde, éditer l'expiration du temps et la lenteur du matin. – Esko

0

Jetez un oeil à ClassMexer qui est juste une implémentation simple de la nouvelle interface java.lang.instrument.Instrumentation. Suivez simplement les instructions, qui sont assez simples.

Il peut être trop intrusif pour votre utilisation car il fonctionne en tant que javaagent mais, d'après votre exemple, ça devrait aller.

0

Vous pouvez obtenir une estimation, en obtenant le nombre exact si difficile. Pourquoi est-ce nécessaire?

Questions connexes