Voulez-vous pointer vers certains documents? J'ai du mal à croire que la taille d'un booléen dépend de la machine. Cela signifierait que la représentation binaire d'une classe contenant un booléen aurait différentes tailles (et dispositions de mémoire) dans différentes VM et cela impliquerait que les VM ne seraient pas compatibles.
David Rodríguez - dribeas
14
Je pense qu'il était implicite que la question se réfère à la taille d'une variable booléenne en mémoire, et non à la taille d'une variable booléenne encodée dans un fichier de classe. La taille de la mémoire varie selon la machine virtuelle selon la documentation de Sun. La taille dans le fichier de classe est constante.
William Brendel
3
@ DavidRodríguez-dribeas - La JVM Sun à l'époque de Java 1.1 utilisait 4 octets pour boolean lorsqu'elle était stockée en tant qu'instance ou var auto. Cela simplifiait la mise en œuvre de l'interpréteur de bytecode (qui considère les booléens comme occupant 4 octets sur la pile) et était le chemin de moindre résistance. Lorsque nous avons implémenté la JVM iSeries "Classic", nous avons trouvé des moyens de rendre les variables d'instance de 1 octet, car cela améliorait considérablement la compacité de certains objets (ce qui a un impact incroyable sur les performances). Apparemment, sur la base des articles ci-dessous, les développeurs de Sun / Oracle ont compris comment faire de même dans les versions ultérieures.
Hot Licks
Mais c'est vrai, à la fin de 2017, les JavaDocs disent: boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined- mais votre point est valide, il pourrait utiliser des liens et de meilleures informations :)
Pour réitérer, cela dépend de la VM, mais sur mon ordinateur portable Windows exécutant le JDK build 1.6.0_11 de Sun, j'ai obtenu les résultats suivants:
@skeet - Je vous salue vraiment, votre réponse est géniale
Warrior
2
@warrior: Comme j'avais déjà obtenu le code pour "byte", le changer en "boolean" était assez simple :)
Jon Skeet
3
System.gc () ne garantit pas le nettoyage de la mémoire. Cela donne simplement un ordre à la JVM d'exécuter le ramasse-miettes, mais cela ne signifie pas que le collecteur a réellement nettoyé quelque chose. N'oubliez pas que le collecteur nettoie les objets INUTILISÉS. Un objet est inutilisé si le programme ne contient plus de références à lui. Donc, dans votre test, je supprimerais explicitement la référence en définissant LotsOfBooleans sur null avant d'exécuter gc (); OU exécutez simplement main une fois avec booléen, une fois avec int puis comparez les nombres.
Randa Sbeity
2
@RandaSbeity Ou encore mieux: assurez-vous de conserver les deux références et de calculer la différence de mémoire. C'est exactement ce qui se passe ici.
biziclop
1
Y a-t-il une question à laquelle Jon Skeet ne peut pas répondre?
Andreas Hartmann
31
Les informations réelles représentées par une valeur booléenne en Java sont d'un bit: 1 pour vrai, 0 pour faux. Cependant, la taille réelle d'une variable booléenne en mémoire n'est pas définie avec précision par la spécification Java. Voir Types de données primitifs en Java .
Le type de données booléen n'a que deux valeurs possibles: true et false. Utilisez ce type de données pour les indicateurs simples qui suivent les conditions vrai / faux. Ce type de données représente un bit d'information, mais sa "taille" n'est pas définie avec précision.
Si vous envisagez d'utiliser un tableau d'objets booléens, ne le faites pas. Utilisez plutôt un BitSet - il a quelques optimisations de performances (et quelques méthodes supplémentaires intéressantes, vous permettant d'obtenir le prochain bit set / unset).
Cette réponse suggère qu'il y a des raisons significatives d'utiliser boolean [], mais comme l'indiquent les commentaires, il n'y a pas grand-chose à sauvegarder. Cela dit: je ne programme pas beaucoup en Java (et je n'ai fourni aucune preuve non plus;)
Matthew Schinckel
6
J'ai lu que Java réserve un octet pour un booleantype de données, mais il n'utilise qu'un seul bit. Cependant, la documentation dit que "sa" taille "n'est pas quelque chose qui est précisément défini" .
Vois ici.
Ce n'est pas nécessairement ainsi qu'ils sont stockés en mémoire, et je pense que c'est ce que la personne qui pose la question voulait savoir. Ce document décrit le format de fichier de classe (code d'octet compilé), pas la représentation d'une variable booléenne en mémoire, car cela dépend de l'implémentation.
William Brendel
2
La taille du booléen en java dépend de la machine virtuelle. mais tout objet Java est aligné sur une granularité de 8 octets. Un booléen a 8 octets d'en-tête, plus 1 octet de charge utile, pour un total de 9 octets d'informations. La JVM l'arrondit ensuite au multiple suivant de 8. Ainsi, la seule instance de java.lang.Boolean occupe 16 octets de mémoire.
J'aurai tendance à ne pas être d'accord, sur HotSpot JVM 1.7.0_51 l'en-tête a 12 octets + 1 pour le booléen + 3 pour la granularité.
Eugene
14
ne confondez pas booléen avec booléen.
andresp
1
Octets ou bits? 16 octets pour un monde Booleansoit un tel gaspillage ... c'est la taille d'un longqui peut transporter des milliards de fois plus d'informations qu'unBoolean
Dici
0
Ce n'est pas défini; faire des choses comme Jon Skeet l'a suggéré vous donnera une approximation sur une plate-forme donnée, mais le moyen de savoir précisément pour une plate-forme spécifique est d'utiliser un profileur.
Réponses:
Cela dépend de la machine virtuelle.
la source
boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined
- mais votre point est valide, il pourrait utiliser des liens et de meilleures informations :)Cela dépend de la machine virtuelle, mais il est facile d'adapter le code à partir d'une question similaire concernant les octets en Java :
Pour réitérer, cela dépend de la VM, mais sur mon ordinateur portable Windows exécutant le JDK build 1.6.0_11 de Sun, j'ai obtenu les résultats suivants:
Cela suggère que les booléens peuvent fondamentalement être regroupés dans un octet chacun par la JVM de Sun.
la source
Les informations réelles représentées par une valeur booléenne en Java sont d'un bit: 1 pour vrai, 0 pour faux. Cependant, la taille réelle d'une variable booléenne en mémoire n'est pas définie avec précision par la spécification Java. Voir Types de données primitifs en Java .
la source
En passant ...
Si vous envisagez d'utiliser un tableau d'objets booléens, ne le faites pas. Utilisez plutôt un BitSet - il a quelques optimisations de performances (et quelques méthodes supplémentaires intéressantes, vous permettant d'obtenir le prochain bit set / unset).
la source
J'ai lu que Java réserve un octet pour un
boolean
type de données, mais il n'utilise qu'un seul bit. Cependant, la documentation dit que "sa" taille "n'est pas quelque chose qui est précisément défini" . Vois ici.la source
Les
boolean
valeurs sont compilées enint
type de données dans JVM. Regardez ici .la source
La taille du booléen en java dépend de la machine virtuelle. mais tout objet Java est aligné sur une granularité de 8 octets. Un booléen a 8 octets d'en-tête, plus 1 octet de charge utile, pour un total de 9 octets d'informations. La JVM l'arrondit ensuite au multiple suivant de 8. Ainsi, la seule instance de java.lang.Boolean occupe 16 octets de mémoire.
la source
Boolean
soit un tel gaspillage ... c'est la taille d'unlong
qui peut transporter des milliards de fois plus d'informations qu'unBoolean
Ce n'est pas défini; faire des choses comme Jon Skeet l'a suggéré vous donnera une approximation sur une plate-forme donnée, mais le moyen de savoir précisément pour une plate-forme spécifique est d'utiliser un profileur.
la source