2010-03-12 21 views
52
class CheckStore { 
    private String displayText; 
    private boolean state; 
    private String meaningfulText; 
    private URL url; 

    public CheckStore(String text, boolean state) { 
     this.displayText = text; 
     this.state = state; 
    } 
    : 
    : 
} 

Como estoy inicializando sólo dos variables (displayText y state) en el constructor, ¿el resto dos variables (meaningfulText y url que tendrá el valor null) requerirán espacio en la memoria para almacenar null valor.Java - ¿La variable de nula requiere espacio en la memoria

Q1. Creo que requerirán espacio. Si lo hacen, ¿cuánta memoria tiene un valor de null en la memoria (como int toma 4 bytes)?

Q2. Cuánto espacio lleva una secuencia en la memoria. Supongo que dependerá de la longitud de la cadena. Entonces, ¿cuánto espacio ocupa una cuerda en cuanto a la longitud?

Respuesta

47

En Java, null es solo un valor que puede tener una referencia (que es básicamente un puntero restringido). Significa que la referencia no hace referencia a nada. En este caso, aún consume el espacio para la referencia. Esto es 4 bytes en sistemas de 32 bits u 8 bytes en sistemas de 64 bits. Sin embargo, no está consumiendo ningún espacio para la clase a la que apunta la referencia hasta que realmente asigne una instancia de esa clase para apuntar la referencia a.

Editar: En cuanto a la cadena, un String en Java toma 16 bits (2 bytes) para cada carácter, más una pequeña cantidad de gastos generales de contabilidad, que es probablemente no documentada y específica de la implementación.

+0

¿Podría decirme también la razón por la que se necesita diff. espacio en sistemas de 64 bits y 32 bits? –

+1

@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

+10

No necesariamente ... hay un trabajo interesante en HotSpot para evitar esto: http://wikis.sun.com/display/HotSpotInternals/CompressedOops –

9

me gustaría añadir:

  1. variable de tipo de referencia se inicializa como valor nulo.
  2. null no es el objeto. porque (instancia nula de objeto) es igual a falso
  3. solo hay un valor nulo en JVM. No importa cuántas variables se refieran a nulo.

    Objeto s = (Serie) nulo;

    Objeto i = (Entero) nulo;

    System.out.println (s == i); // verdadera

+0

1. * Las variables miembro del tipo de referencia se inicializan como nulas. Las variables locales no son 2. Null no es un 'Object', no porque' null instanceof Object' sea falso, sino porque null es una referencia. 3. Hay tantos valores nulos en una JVM como han sido creados por (a) las inicializaciones de la variable de miembro '' opst_null' opcode (b) (c) etc. La afirmación no tiene sentido. 'null' siempre es igual a sí mismo, pero eso no implica nada sobre la identidad. – EJP

2

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.)

Cuestiones relacionadas