Почему JVM позволяет установить "высокое" значение для IntegerCache, но не "низкое"?
Мы все знаем, что Java имеет кэш для Integer
(и некоторых других типов) для числа в диапазоне [-128, 127]
, которые считаются "обычно используемыми".
Кэш сконструирован следующим образом:
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
?
Обратите внимание, что я не пытался найти обходное решение, но вместо этого понимаю, почему это не допускается по каким-то неясным причинам.
Ответы
Ответ 1
Узнал, что на этом уже существует неразрешенный RFP.
Джо Дарси прокомментировал проблему:
Можно предположить, что было бы полезно кэшировать более широкий диапазон отрицательное число, но пока еще не было насущной необходимости для этого.
Обратите внимание, что RFP предлагает плохое обходное решение, если кто-либо заинтересован в использовании этого до его обработки:
Обходной путь для увеличения размер кеша отдельно от реализации собственного кеша и перед этим перейдем к классу java.lang.Integer. Это, очевидно, не очень хорошо, так как требует вызовов других классов а не просто использование по умолчанию вызова Integer.valueOf(int i).