Usted puede utilizar jol para obtener el diseño de esa clase. (Sin embargo, tenga cuidado, es posible que necesite una comprensión más profunda de la mecánica subyacente, no confíe ciegamente en el resultado y tenga en cuenta que es solo una estimación de la VM actualmente utilizada (1.7.0_76 x64 gana en mi caso :):
yo uso la versión CLI supongo que el método adecuado sería incluir la biblioteca en su proyecto, pero de todos modos, parece que funciona de esta manera:
test>java -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore
Running 64-bit HotSpot VM.
Using compressed oop with 0-bit shift.
Using compressed klass with 0-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
VM fails to invoke the default constructor, falling back to class-only introspection.
test.CheckStore object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 1 boolean CheckStore.state N/A
13 3 (alignment/padding gap) N/A
16 4 String CheckStore.displayText N/A
20 4 String CheckStore.meaningfulText N/A
24 4 URL CheckStore.url N/A
28 4 (loss due to the next object alignment)
Instance size: 32 bytes (estimated, the sample instance is not available)
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total
y lo mismo con los oops comprimidos automática apagado:
test>java -XX:-UseCompressedOops -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore
Running 64-bit HotSpot VM.
Objects are 8 bytes aligned.
Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
VM fails to invoke the default constructor, falling back to class-only introspection.
test.CheckStore object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 16 (object header) N/A
16 1 boolean CheckStore.state N/A
17 7 (alignment/padding gap) N/A
24 8 String CheckStore.displayText N/A
32 8 String CheckStore.meaningfulText N/A
40 8 URL CheckStore.url N/A
Instance size: 48 bytes (estimated, the sample instance is not available)
Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
Esos son solo los diseños para el objeto en sí si sus campos son nulos, entonces no apuntará a más objetos, de lo contrario deberá mirar los tipos de destino (URL
y String
) también. (Y si tiene varias instancias de todas ellas, depende si usa las mismas varias veces o diferentes). No se puede omitir un campo nulo en la memoria, ya que requeriría cambiar el tamaño de la instancia cuando se asigna.Entonces, todos los campos están preconstruidos, simplemente no hacen referencia a los objetos asignados en otro lugar en el montón.
NB: obtendrá más detalles si implementa un constructor predeterminado, pero el tamaño en este caso específico sería el mismo. En caso de que se pregunte de dónde viene la secuencia y el relleno de los campos, puede marcar this article - (básicamente alinea los objetos en 8 bytes, ordena los campos por tamaño, agrupa los mismos tipos juntos, las referencias son las últimas. Los campos de los supernombres son los primeros, 4 byte alineado.)
¿Podría decirme también la razón por la que se necesita diff. espacio en sistemas de 64 bits y 32 bits? –
@Yatendra: los punteros deben ser lo suficientemente grandes como para abarcar todo el espacio de direcciones. Por lo tanto, en una máquina de 32 bits necesita 32 bits. En una máquina de 64 bits necesitas 64 bits. – dsimcha
No necesariamente ... hay un trabajo interesante en HotSpot para evitar esto: http://wikis.sun.com/display/HotSpotInternals/CompressedOops –