Me pregunto, ¿por qué entre -128 y 127?
Se puede almacenar en caché un rango mayor de enteros , pero al menos aquellos entre -128 y 127 deben almacenarse en caché porque es un mandato de la Especificación del lenguaje Java (el énfasis es mío):
Si el valor p en el cuadro es verdadero, falso, un byte o un carácter en el rango \ u0000 a \ u007f, o un número int o corto entre -128 y 127 (inclusive) , entonces sean r1 y r2 los resultados de dos conversiones de boxeo cualesquiera de p. Siempre es el caso de que r1 == r2.
El fundamento de este requisito se explica en el mismo párrafo:
Idealmente, encuadrar un valor primitivo p dado siempre produciría una referencia idéntica . En la práctica, esto puede no ser factible utilizando las técnicas de implementación existentes. Las reglas anteriores son un compromiso pragmático. La cláusula final anterior requiere que ciertos valores comunes siempre estén encuadrados en objetos indistinguibles. [...]
Esto asegura que, en los casos más comunes, el comportamiento será el deseado, sin imponer una penalización indebida del rendimiento, especialmente en dispositivos pequeños . Las implementaciones con menos memoria limitada pueden, por ejemplo, almacenar en caché todos los valores char y short, así como los valores int y long en el rango de -32K a + 32K.
¿Cómo puedo almacenar en caché otros valores fuera de este rango?
Puede utilizar la -XX:AutoBoxCacheMaxopción JVM, que no está realmente documentada en la lista de opciones de JVM de Hotspot disponibles . Sin embargo, se menciona en los comentarios dentro de la Integerclase alrededor de la línea 590 :
El tamaño de la caché puede controlarse mediante la -XX:AutoBoxCacheMax=<size>opción.
Tenga en cuenta que esto es específico de la implementación y puede o no estar disponible en otras JVM.