为什么 JVM 允许为 IntegerCache 设置 "high" 值,而不是 "low"?

Why does the JVM allow to set the "high" value for the IntegerCache, but not the "low"?

我们都知道 Java 有一个 Integer(和一些其他类型)的缓存,用于 [-128, 127] 范围内的数字,被认为是 "commonly used"。

缓存设计如下:

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

我知道我可以通过给 JVM 一个参数来扩展 high 值:

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

我不明白的是为什么我们不允许覆盖 low 值?

请注意,我并不是要寻找解决方法,而是要了解为什么出于某些不明确的原因不允许这样做。

发现这上面已经有一个未解决的RFP

Joe Darcy 对这个问题发表了评论:

It is conceivable that it would be helpful to cache a greater range of negative number as well, but as of yet there has been no pressing need to do so.

请注意,如果有人在处理之前有兴趣使用它,那么 RFP 提供的解决方法很差:

No workaround possible for increasing the size of the cache apart from Implementing your own cache and reffering to this first before going to the java.lang.Integer class. This is obviously not good as it requires calls to other classes rather than just the default use of the Integer.valueOf(int i) call.