`
RednaxelaFX
  • 浏览: 3013453 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

[FYI] 关于Integer的自动缓存大小

    博客分类:
  • Java
阅读更多
For your information.

最近又看到有人提到java.lang.Integer的自动装箱的缓存大小问题。这里想提一下这个值在VM启动时是可配置的。下面例子使用32位Windows上的Sun JDK 1.6.0 update 18。

在Java语言规范第三版,5.1.7 Boxing Conversion中,
The Java Language Specification, 3rd 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模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]。注意区间的下界固定在-128不可配置。
在client模式下该参数无效。这个参数是server模式专有的,在c2_globals.hpp中声明,默认值是128;不过这个默认值在默认条件下不起作用,要手动设置它的值或者是开启-XX:+AggressiveOpts参数才起作用。

在设置了-XX:+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 'AutoBoxCacheMax=1000'错误是因为这个参数只能在HotSpot Server VM上使用,在HotSpot Client VM上不支持。
分享到:
评论
10 楼 Trust_FreeDom 2016-10-25  
请问像IntegerCache这种基本数据类型的Cache,是放在JVM的什么区域的?Integer类的运行时常量池??

JDK 1.7的去永久代应该只是将字符串常量池从永久代改到堆里了吧?运行时常量池还在方法区/永久代??
9 楼 ZangXT 2010-06-25  
_07是固定的,这么说,可以修改源代码来做。呵
mercyblitz 写道
1.6.0_07是固定的,这么说,可以修改源代码来做。呵呵

需要重编译jdk了吧。
8 楼 mercyblitz 2010-06-23  
1.6.0_07是固定的,这么说,可以修改源代码来做。呵呵
7 楼 yznxing 2010-06-11  
RednaxelaFX 写道
yznxing 写道
听你这些话 言语中透着 凄凉。。。。

哪里凄凉了,Java程序员咖啡时间多啊


这么乐观。
可惜我咖啡喝的很少。你说是不是很纠结。。。
6 楼 RednaxelaFX 2010-06-08  
yznxing 写道
听你这些话 言语中透着 凄凉。。。。

哪里凄凉了,Java程序员咖啡时间多啊
5 楼 yznxing 2010-06-08  
RednaxelaFX 写道
lwwin 写道
忽然想问问FX大做什么的工作,是和脚本技术相关的开发研究吗^^?

感觉找你肯定是找对了~

不,几乎完全无关。除了整合Groovy是工作的一部分外,没有跟脚本相关的工作内容。



听你这些话 言语中透着 凄凉。。。。
4 楼 RednaxelaFX 2010-06-02  
ZangXT 写道
JLS指定的是【-128,127】之间的数。不知道这个可配置型是从哪个版本开始引入的,我从安装的jdk1.6.0_10来看,Integer的cache还是这样设置的:
……

看了一下,应该是从JDK 6 update 14开始变为可配置的。13的时候上界还是固定的127。不过AutoBoxCacheMax参数在13的时候就已经存在了(具体出现的时间可能更早);在14之前,该参数只在HotSpot一侧的代码里有出现,没设置到Java一侧的java.lang.Integer里。
3 楼 ZangXT 2010-06-02  
JLS指定的是【-128,127】之间的数。不知道这个可配置型是从哪个版本开始引入的,我从安装的jdk1.6.0_10来看,Integer的cache还是这样设置的:
 private static class IntegerCache {
	private IntegerCache(){}

	static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }

jdk1.6.0_20(至少在博主提到的18版本的就改成可配置的了)
private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

           [i] // high value may be configured by property[/i]            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

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

        private IntegerCache() {}
    }
2 楼 RednaxelaFX 2010-06-01  
lwwin 写道
忽然想问问FX大做什么的工作,是和脚本技术相关的开发研究吗^^?

感觉找你肯定是找对了~

不,几乎完全无关。除了整合Groovy是工作的一部分外,没有跟脚本相关的工作内容。
1 楼 lwwin 2010-06-01  
忽然想问问FX大做什么的工作,是和脚本技术相关的开发研究吗^^?

感觉找你肯定是找对了~

相关推荐

    FYI显示屏程序V2.76

    FYI显示屏程序V2.76FYI显示屏程序V2.76FYI显示屏程序V2.76FYI显示屏程序V2.76

    传真组件 FYI FYI.CO_

    最便宜的下载分数. 给大家分享一下.最便宜的下载分数. 给大家分享一下.

    FYI For Your Improvement如何自我提升 英文

    FYI For Your Improvement如何自我提升 英文

    FYI代码.txt

    FYI代码.txt

    FYI.CO_

    FYI.CO_ 进程 fxsevent.dll Version Windows

    FYI-crx插件

    语言:English (UK) chrome&extension更新通知程序 ***此扩展名为EOL *** 使用... Rich桌面通知所需的Chrome 28+ 有关更多信息:http://goo.gl/hlnya gplv3代码 https://github.com/saltiresoul/fyi

    《创新学原理及应用》(FYI).doc

    《创新学原理及应用》(FYI).doc

    FYI: Search, Find, and Organize Documents-crx插件

    fyi与g套件,slack,dropbox,box,Onedrive,Evernote和十几个 云应用程序。 特征: ✓在一个地方搜索和查找文档 ✓查看最近创建和更新的文档 ✓通过您使用的应用浏览文档 ✓支持每个应用连接多个帐户 ✓从浏览器...

    fyi.cov传真文件

    这是XP系统的传真支持文件。这是XP系统的传真支持文件。这是XP系统的传真支持文件。这是XP系统的传真支持文件。

    Q1-2011国内各主要光伏企业财报汇总表[FYI].docx

    Q1-2011国内各主要光伏企业财报汇总表[FYI].docx

    XP传真最齐组件 fxssend FYI.CO_ generic urgent

    电脑发传真必须的组件 我打包发上来 包含fxssend FYI.CO_ generic urgent CONFDENT.CO_ fxscfgwz.dll fxsclntr.dll fxscount FXSCOUNT.H_ fxsext.ecf fxsperf fxsroute.dl

    GenderDysphoria.fyi:网站代码

    代码库。 该站点的代码以MIT许可的形式分发。 网站内容(例如论文和照片材料)是Jocelyn Badgley和其他贡献者的版权,并已获得知识共享许可,署名Attribution-NonCommercial-ShareAlike(请参阅 )。...

    mybrowser.fyi-project:https的路线图和问题跟踪器

    mybrowser.fyi项目 嘿! :waving_hand: 感谢您的光临。 该存储库的设置是为了映射路线图并跟踪任何问题。 如果您要在此处记录问题,请。 如果您在这里查看路线图,则可以看到。

    Squirrel.fyi-crx插件

    此扩展程序获取squirrel.fyi书签服务的页面信息 通过使用squirrel.fyi标记平台和chrome浏览器扩展程序,此扩展程序提供了一种跟踪与您相关的信息的简单方法。 有关更多信息,请查看squirrel.fyi!

    FYI Extension-crx插件

    使用此扩展名将链接添加到您的FYI智能列表或董事会。 FYI.to是一个微型网站构建器和人工内容管理工具,只需复制和粘贴链接即可使用。 您可以使用它来组织,共享和推广任何种类的内容。 在用户注册帐户后,该工具可...

    fyi

    供参考

Global site tag (gtag.js) - Google Analytics