¿Le importaría señalar algunos documentos? Me cuesta creer que el tamaño de un booleano dependa de la máquina. Eso significaría que la representación binaria de una clase que contiene un booleano tendría diferentes tamaños (y diseños de memoria) en diferentes VM y eso implicaría que las VM no serían compatibles.
David Rodríguez - dribeas
14
Creo que estaba implícito que la pregunta se refiere al tamaño de una variable booleana en la memoria, no al tamaño de una variable booleana codificada en un archivo de clase. El tamaño de la memoria varía según la máquina virtual según la documentación de Sun. El tamaño en el archivo de clase es constante.
William Brendel
3
@ DavidRodríguez-dribeas - La JVM de Sun en la época de Java 1.1 usaba 4 bytes para booleano cuando se almacenaba como una instancia o auto var. Esto simplificó la implementación del intérprete de código de bytes (que considera que los bools ocupan 4 bytes en la pila) y fue el camino de menor resistencia. Cuando implementamos la JVM iSeries "Classic", encontramos formas de hacer vars de instancia de 1 byte, ya que eso mejoró enormemente la compacidad de algunos objetos (lo que tiene un impacto asombroso en el rendimiento). Aparentemente, según las publicaciones a continuación, los desarrolladores de Sun / Oracle descubrieron cómo hacer lo mismo en versiones posteriores.
Hot Licks
Pero es correcto, a finales de 2017, los JavaDocs dicen: boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined- pero su punto es válido, podrían usar algunos enlaces y mejor información :)
Para reiterar, esto depende de la VM, pero en mi computadora portátil con Windows que ejecuta Sun's JDK build 1.6.0_11 obtuve los siguientes resultados:
@skeet - Realmente te saludo. Tu respuesta es increíble
Warrior
2
@warrior: Como ya tenía el código para "byte", cambiarlo a "booleano" fue bastante sencillo :)
Jon Skeet
3
System.gc () no garantiza la limpieza de la memoria. Simplemente le da una orden a la JVM para que ejecute la recolección de basura, pero no significa que el recolector realmente limpió algo. Recuerde que el coleccionista limpia los objetos NO UTILIZADOS. Un objeto no se utiliza si el programa no tiene más referencias a él. Entonces, en su prueba, eliminaría explícitamente la referencia configurando LotsOfBooleans en nulo antes de ejecutar gc (); O simplemente ejecute main una vez con boolean, una vez con int y luego compare los números.
Randa Sbeity
2
@RandaSbeity O incluso mejor: asegúrese de conservar ambas referencias y calcular la diferencia de memoria. Que es exactamente lo que pasa aquí.
biziclop
1
¿Hay alguna pregunta que Jon Skeet no pueda responder?
Andreas Hartmann
31
La información real representada por un valor booleano en Java es un bit: 1 para verdadero, 0 para falso. Sin embargo, el tamaño real de una variable booleana en la memoria no está definido con precisión por la especificación de Java. Consulte Tipos de datos primitivos en Java .
El tipo de datos booleano solo tiene dos valores posibles: verdadero y falso. Utilice este tipo de datos para indicadores simples que rastrean condiciones verdaderas / falsas. Este tipo de datos representa un bit de información, pero su "tamaño" no es algo que esté definido con precisión.
Si está pensando en utilizar una matriz de objetos booleanos, no lo haga. En su lugar, utilice un BitSet: tiene algunas optimizaciones de rendimiento (y algunos métodos extra agradables que le permiten obtener el siguiente bit activado / desactivado).
Esa respuesta sugiere que hay razones importantes para usar boolean [], pero como indican los comentarios allí, no hay mucho que respalde. Habiendo dicho eso: no
programo
6
Leí que Java reserva un byte para un booleantipo de datos, pero usa solo un bit. Sin embargo, la documentación dice que "su" tamaño "no es algo que esté definido con precisión" .
Mira aquí.
No es necesariamente así como se almacenan en la memoria, y creo que eso es lo que la persona que hace la pregunta quería saber. Ese documento describe el formato de archivo de clase (código de bytes compilado), no la representación de una variable booleana en la memoria, porque eso depende de la implementación.
William Brendel
2
El tamaño del booleano en Java depende de la máquina virtual. pero cualquier objeto Java está alineado con una granularidad de 8 bytes. Un booleano tiene 8 bytes de encabezado, más 1 byte de carga útil, para un total de 9 bytes de información. La JVM luego lo redondea al siguiente múltiplo de 8. por lo que la única instancia de java.lang.Boolean ocupa 16 bytes de memoria.
Tiendo a no estar de acuerdo, en HotSpot JVM 1.7.0_51 el encabezado tiene 12 bytes + 1 para el booleano + 3 para la granularidad.
Eugene
14
no confunda booleano con booleano.
andresp
1
Bytes o bits? 16 bytes para un mundo Booleansería un desperdicio ... ese es el tamaño de un longque puede transportar un billón de veces más información que unBoolean
Dici
0
No está definido; Hacer cosas como las que sugirió Jon Skeet le dará una aproximación en una plataforma determinada, pero la forma de saberlo con precisión para una plataforma específica es usar un generador de perfiles.
Respuestas:
Depende de la máquina virtual.
fuente
boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined
- pero su punto es válido, podrían usar algunos enlaces y mejor información :)Depende de la máquina virtual, pero es fácil adaptar el código de una pregunta similar sobre bytes en Java :
Para reiterar, esto depende de la VM, pero en mi computadora portátil con Windows que ejecuta Sun's JDK build 1.6.0_11 obtuve los siguientes resultados:
Eso sugiere que los valores booleanos se pueden empaquetar básicamente en un byte cada uno mediante la JVM de Sun.
fuente
La información real representada por un valor booleano en Java es un bit: 1 para verdadero, 0 para falso. Sin embargo, el tamaño real de una variable booleana en la memoria no está definido con precisión por la especificación de Java. Consulte Tipos de datos primitivos en Java .
fuente
En otros comentarios...
Si está pensando en utilizar una matriz de objetos booleanos, no lo haga. En su lugar, utilice un BitSet: tiene algunas optimizaciones de rendimiento (y algunos métodos extra agradables que le permiten obtener el siguiente bit activado / desactivado).
fuente
Leí que Java reserva un byte para un
boolean
tipo de datos, pero usa solo un bit. Sin embargo, la documentación dice que "su" tamaño "no es algo que esté definido con precisión" . Mira aquí.fuente
Los
boolean
valores se compilan enint
el tipo de datos en JVM. Vea aquí .fuente
El tamaño del booleano en Java depende de la máquina virtual. pero cualquier objeto Java está alineado con una granularidad de 8 bytes. Un booleano tiene 8 bytes de encabezado, más 1 byte de carga útil, para un total de 9 bytes de información. La JVM luego lo redondea al siguiente múltiplo de 8. por lo que la única instancia de java.lang.Boolean ocupa 16 bytes de memoria.
fuente
Boolean
sería un desperdicio ... ese es el tamaño de unlong
que puede transportar un billón de veces más información que unBoolean
No está definido; Hacer cosas como las que sugirió Jon Skeet le dará una aproximación en una plataforma determinada, pero la forma de saberlo con precisión para una plataforma específica es usar un generador de perfiles.
fuente