[FYI]Integerの自動キャッシュサイズについて


For your information.
最近java.lang.Integerの自動梱包のキャッシュサイズの問題についても言及されています.ここで,この値はVM起動時に構成可能であることを示したい.次の例では、32ビットWindowsのSun JDK 1.6.0 update 18を使用します.
Java言語仕様第3版、5.1.7 Boxing Conversionでは、
The Java Language Specification,3 rd Editionは
If the value p being boxed is true, false, a byte, a char in the range\u0000 to\u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.
これは、仕様に合致するJava実装が、Integerのキャッシュが少なくとも[-128,127]の範囲をカバーすることを保証しなければならない理由である.
Oracle/SUN JDK 6を使用して、serverモードで-XAutoBoxCacheMax=NNNパラメータを使用してIntegerの自動キャッシュ区間を[-128,NNN]に設定します.注意区間の下限は-128に固定されて配置できません.
クライアントモードではこのパラメータは無効です.このパラメータはserverモード専用で、
c2_globals.hppに宣言され、デフォルト値は128です.ただし、このデフォルト値はデフォルトでは機能しません.手動で値を設定するか、-XX:+AggressiveOptsパラメータをオンにします.
-X:+AggressiveOpts起動パラメータが設定されている場合、AutoBoxCacheMaxのデフォルト値は20000に変更され、有効になります.リファレンス
arguments.cpp :
// Aggressive optimization flags  -XX:+AggressiveOpts
void Arguments::set_aggressive_opts_flags() {
#ifdef COMPILER2
  if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
    if (FLAG_IS_DEFAULT(EliminateAutoBox)) {
      FLAG_SET_DEFAULT(EliminateAutoBox, true);
    }
    if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
      FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000);
    }

    // Feed the cache size setting into the JDK
    char buffer[1024];
    sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax);
    add_property(buffer);
  }
  // ...
#endif
}

テストコード:
// run with:
// java -server -XX:AutoBoxCacheMax=1000 TestAutoBoxCache

public class TestAutoBoxCache {
    public static void main(String[] args) {
        Integer a = 1000;
        Integer b = 1000;
        System.out.println(a == b);
        
        Integer c = 1001;
        Integer d = 1001;
        System.out.println(c == d);
        
        Integer e = 20000;
        Integer f = 20000;
        System.out.println(e == f);
    }
}

コマンドラインでテスト:
D:\>javac TestAutoBoxCache.java

D:\>java TestAutoBoxCache
false
false
false

D:\>java -server TestAutoBoxCache
false
false
false

D:\>java -Djava.lang.Integer.IntegerCache.high=1000 TestAutoBoxCache
true
false
false

D:\>java -server -Djava.lang.Integer.IntegerCache.high=1000 TestAutoBoxCache
true
false
false

D:\>java -Djava.lang.Integer.IntegerCache.high=1001 TestAutoBoxCache
true
true
false

D:\>java -server -Djava.lang.Integer.IntegerCache.high=1001 TestAutoBoxCache
true
true
false

D:\>java -XX:AutoBoxCacheMax=1000 TestAutoBoxCache
Unrecognized VM option 'AutoBoxCacheMax=1000'
Could not create the Java virtual machine.

D:\>java -server -XX:AutoBoxCacheMax=1000 TestAutoBoxCache
true
false
false

D:\>java -server -XX:AutoBoxCacheMax=1001 TestAutoBoxCache
true
true
false

D:\>java -server -XX:+AggressiveOpts TestAutoBoxCache
true
true
true

中間報
Unrecognized VM option'AutoBox CacheMax=1000'エラーは、このパラメータがHotSpot Server VMでのみ使用できるため、HotSpot Client VMではサポートされていません.