2015-04-14 2 views
17

Мы все знаем, что Java имеет кэш для Integer (и некоторых других типов) для номера в диапазоне [-128, 127], которые считаются «обычно используемыми».Почему JVM позволяет установить «высокое» значение для IntegerCache, но не «низкое»?

Кэш разработан следующим образом:

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() {} 
} 

Я знаю, что я могу продлить значение high давая параметр в JVM:

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

То, что я не понимаю, почему не разрешено ли переопределять значение low?

Обратите внимание, что я не пытался найти обходное решение, но вместо этого понимаю, почему это запрещено для некоторых неясных причин.

ответ

10

Обнаружил, что на этом уже есть неразрешенный RFP.

Джо Дарси прокомментировал вопрос:

Вполне возможно, что это было бы полезно кэшировать больший диапазон отрицательного числа, а также, но пока там было никакой насущной необходимости не делать так.

Обратите внимание, что ЗП предлагает плохой обходной путь, если когда-нибудь кто-то были заинтересованы в использовании этого, прежде чем он обрабатывается: возможно

Нет решения для повышения размера кэша кроме Реализации собственного кэша и , прежде чем перейти к классу java.lang.Integer. Это, очевидно, не так хорошо, поскольку для вызова классов в другие классы вместо использования по умолчанию вызова Integer.valueOf (int i).

Смежные вопросы