2015-04-14 6 views
17

Wir alle wissen, dass Java einen Cache für Integer (und einige andere Typen) für die Nummer im Bereich [-128, 127] hat, die als "allgemein verwendet" gelten.Warum erlaubt die JVM den "hohen" Wert für den IntegerCache, aber nicht den "niedrigen" Wert?

Der Cache ist wie folgt konzipiert:

private static class IntegerCache { 
    static final int low = -128; 
    static final int high; 
    static final Integer cache[]; 

    static { 
     // high value may be configured by property 
     int h = 127; 
     String integerCacheHighPropValue = 
      sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); 
     if (integerCacheHighPropValue != null) { 
      try { 
       int i = parseInt(integerCacheHighPropValue); 
       i = Math.max(i, 127); 
       // Maximum array size is Integer.MAX_VALUE 
       h = Math.min(i, Integer.MAX_VALUE - (-low) -1); 
      } catch(NumberFormatException nfe) { 
       // If the property cannot be parsed into an int, ignore it. 
      } 
     } 
     high = h; 

     cache = new Integer[(high - low) + 1]; 
     int j = low; 
     for(int k = 0; k < cache.length; k++) 
      cache[k] = new Integer(j++); 

     // range [-128, 127] must be interned (JLS7 5.1.7) 
     assert IntegerCache.high >= 127; 
    } 

    private IntegerCache() {} 
} 

Ich weiß, dass ich den high Wert, indem Sie einen Parameter auf die JVM erweitern können:

java -Djava.lang.Integer.IntegerCache.high=xxxx Aclass.class 

Was ich nicht verstehe ist, warum dürfen wir den low Wert nicht überschreiben?

Beachten Sie, dass ich nicht versucht habe, eine Problemumgehung zu finden, sondern verstehe, warum dies aus irgendwelchen Gründen nicht erlaubt ist.

Antwort

10

Gefunden, dass es bereits einen ungelösten RFP auf diesem gibt.

Joe Darcy kommentierte die Frage:

Es ist denkbar, dass es hilfreich wäre, auch eine größere Bandbreite an negative Zahl zwischenzuspeichern, aber bisher gab es keine dringende Notwendigkeit zu tun damit.

Beachten Sie, dass die RFP eine schlechte Abhilfe bieten, wenn überhaupt jemand sich mit der daran interessiert war, bevor es behandelt wird:

Keine Abhilfe möglich die Größe des Cache-Speichers zu erhöhen abgesehen von Ihrem eigenen Cache-Implementierung und zuerst zu diesem Thema, bevor Sie in die Klasse java.lang.Integer gehen. Dies ist offensichtlich nicht gut, da es Aufrufe an andere Klassen statt nur die Standardverwendung des Aufrufs Integer.valueOf (int i) erfordert.

Verwandte Themen