Perché i valori nella cache di class intera nell’intervallo da -128 a 127?

Per quanto riguarda la mia domanda precedente, perché fare == confronti con Integer.valueOf (String) danno risultati diversi per 127 e 128? , sappiamo che la class Integer ha una cache che memorizza valori compresi tra -128 e 127 .

Mi chiedo solo, perché tra -128 e 127 ?

La documentazione Integer.valueOf () ha dichiarato che memorizza nella cache i valori richiesti di frequente . Ma i valori tra -128 e 127 sono spesso richiesti per reali? Ho pensato che i valori richiesti frequentemente sono molto soggettivi.
C’è qualche ansible ragione dietro a questo?

Dalla documentazione è inoltre indicato: “… e potrebbe memorizzare nella cache altri valori al di fuori di questo intervallo.
Come si può ottenere questo?

Mi chiedo solo, perché tra -128 e 127?

Un intervallo più ampio di numeri interi può essere memorizzato nella cache, ma almeno quelli compresi tra -128 e 127 devono essere memorizzati nella cache poiché è richiesto dalla specifica del linguaggio Java (enfasi mia):

Se il valore p in box è true, false, un byte o un char nell’intervallo da \ u0000 a \ u007f o un numero int o short compreso tra -128 e 127 (inclusi) , quindi r1 e r2 devono essere i risultati di ogni due conversioni di boxe di p. È sempre il caso che r1 == r2.

La motivazione di questo requisito è spiegata nello stesso paragrafo:

Idealmente, inscatolare un dato valore primitivo p, darebbe sempre un riferimento identico . In pratica, questo potrebbe non essere fattibile utilizzando le tecniche di implementazione esistenti. Le regole di cui sopra sono un compromesso pragmatico. La clausola finale sopra richiede che determinati valori comuni siano sempre racchiusi in oggetti indistinguibili. […]

Ciò garantisce che, nei casi più comuni, il comportamento sia quello desiderato, senza imporre una penalità di prestazioni eccessive, specialmente su dispositivi di piccole dimensioni . Ad esempio, meno implementazioni a memoria limitata potrebbero memorizzare nella cache tutti i valori char e short, nonché i valori int e long nell’intervallo da -32K a +32K.


Come posso memorizzare altri valori al di fuori di questo intervallo?

È ansible utilizzare l’opzione -XX:AutoBoxCacheMax JVM, che non è realmente documentata nell’elenco delle opzioni JVM di Hotspot disponibili . Tuttavia è menzionato nei commenti all’interno della class Integer attorno alla linea 590 :

La dimensione della cache può essere controllata -XX:AutoBoxCacheMax= .

Si noti che questa è specifica dell’implementazione e potrebbe o meno essere disponibile su altre JVM.

Da -128 a 127 è la dimensione predefinita. Ma javadoc dice anche che la dimensione della cache Integer può essere controllata -XX:AutoBoxCacheMax= . Si noti che imposta solo un valore alto, il valore basso è sempre -128. Questa funzionalità è stata introdotta in 1.6.

Per quanto riguarda il motivo, da -128 a 127, si tratta di un intervallo di valori in byte ed è naturale utilizzarlo per una cache molto piccola.

Il motivo per la memorizzazione nella cache di piccoli numeri interi, se questo è quello che stai chiedendo, è che molti algoritmi usano piccoli numeri interi nei loro calcoli, quindi evitare il sovraccarico di creazione di oggetti per questi valori tende a essere utile.

La domanda diventa quindi gli Integer da memorizzare nella cache. Di nuovo, parlando in generale, la frequenza con cui i valori costanti vengono usati tende a diminuire all’aumentare del valore assoluto della costante – ognuno spende molto tempo usando i valori 1 o 2 o 10, relativamente pochi usano il valore 109 molto intensamente; meno prestazioni avranno prestazioni dipendono da quanto velocemente si può ottenere un intero per 722 .. Java ha scelto di allocare 256 slot che coprono l’intervallo di un valore di byte con segno. Questa decisione può essere stata informata analizzando i programmi esistenti al momento, ma è altrettanto probabile che sia stata puramente arbitraria. È una quantità ragionevole di spazio da investire, è ansible accedervi rapidamente (maschera per scoprire se il valore è compreso nell’intervallo della cache, quindi una rapida tabella di ricerca per accedere alla cache) e coprirà sicuramente i casi più comuni.

In altre parole, penso che la risposta alla tua domanda sia “non è soggettivo come pensavi, ma i limiti esatti sono in gran parte una decisione empirica … e le prove sperimentali sono state che è stato abbastanza buono. ”

Il valore intero massimo massimo che può essere memorizzato nella cache può essere configurato tramite la proprietà di sistema, ad esempio java.lang.Integer.IntegerCache.high ( -XX:AutoBoxCacheMax ). La cache è implementata usando una matrice.

  private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } 

Quando si incontra la class Integer e sempre racchiuso nell’intervallo da -128 a 127, è sempre meglio convertire l’object intero in valore int come indicato di seguito.

 .intValue()