logo java optimization jvm

java - logo - apache hbase download



Caché de enteros en Java (2)

Posible duplicado:
Weird Java Boxing

Recientemente vi una presentación donde estaba el siguiente ejemplo de código Java:

Integer a = 1000, b = 1000; System.out.println(a == b); // false Integer c = 100, d = 100; System.out.println(c == d); // true

Ahora estoy un poco confundido. Entiendo por qué en el primer caso el resultado es "falso", porque Integer es un tipo de referencia y las referencias de "a" y "b" son diferentes.

¿Pero por qué en el segundo caso el resultado es "verdadero"?

He escuchado una opinión, que el almacenamiento en memoria caché JVM objetos para valores int de -128 a 127 con fines de optimización. De esta manera, las referencias de "c" y "d" son las mismas.

¿Alguien puede darme más información sobre este comportamiento? Quiero entender los propósitos de esta optimización. En qué casos se aumenta el rendimiento, etc. La referencia a algunas investigaciones de este problema será excelente.


Quiero entender los propósitos de esta optimización. En qué casos se aumenta el rendimiento, etc. La referencia a algunas investigaciones de este problema será excelente.

El objetivo principal es ahorrar memoria, lo que también conduce a un código más rápido debido a una mejor eficacia de la memoria caché.

Básicamente, la clase Integer mantiene un caché de instancias de Integer en el rango de -128 a 127, y todos los autoboxing, literales y usos de Integer.valueOf() devolverán instancias de ese caché para el rango que cubre.

Esto se basa en la suposición de que estos pequeños valores se producen con mucha más frecuencia que otras y, por lo tanto, tiene sentido evitar la sobrecarga de tener diferentes objetos para cada instancia (un objeto Integer ocupa algo así como 12 bytes).


Mire la implementación de Integer.valueOf(int) . Devolverá el mismo objeto Integer para entradas inferiores a 256 .

EDITAR:

En realidad es -128 a +127 por defecto como se indica a continuación.