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

For your information.

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

在Java语言规范第三版,5.1.7 Boxing Conversion中,
[quote="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.[/quote]
这就是为什么符合规范的Java实现必须保证Integer的缓存至少要覆盖[-128, 127]的范围。

使用Oracle/Sun JDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]。注意区间的下界固定在-128不可配置。
在client模式下该参数无效。这个参数是server模式专有的,在[url=http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/d2f6f71320bd/src/share/vm/opto/c2_globals.hpp]c2_globals.hpp[/url]中声明,默认值是128;不过这个默认值在默认条件下不起作用,要手动设置它的值或者是开启-XX:+AggressiveOpts参数才起作用。

在设置了-XX:+AggressiveOpts启动参数后,AutoBoxCacheMax的默认值会被修改为20000并且生效。参考[url=http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/d2f6f71320bd/src/share/vm/runtime/arguments.cpp]arguments.cpp[/url]:
// 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

中间报[color=red]Unrecognized VM option 'AutoBoxCacheMax=1000'[/color]错误是因为这个参数只能在HotSpot Server VM上使用,在HotSpot Client VM上不支持。
### PCIe 测试方法和工具 #### 功能测试 设备识别测试是验证 PCI Express (PCIe) 设备能否被正确检测并初始化的重要环节[^1]。此过程涉及确认操作系统能够发现新安装的硬件,并加载相应的驱动程序。 对于更深入的功能检验,需覆盖从物理连接直至事务处理的所有层面: - **链路训练与状态机(LTSSM)**:确保两个端口可以成功建立链接。 - **配置空间读写操作**:检查是否能正常访问寄存器。 - **热插拔能力**:模拟移除或插入模块的动作来观察系统的响应情况。 #### 性能测试 为了衡量 PCIe 的实际吞吐量以及延迟特性,采用专门设计的应用程序来进行压力测试十分必要[^2]。这类软件往往具备如下特点: - 支持多队列并发传输; - 可定制数据包大小及模式; - 提供详尽的结果报告以便分析瓶颈所在; 常见的性能评测工具有 IOMeter 和 FIO 等开源项目可供选用。 #### 综合评估手段 除了上述两类基础性的考察外,还应考虑其他可能影响稳定运行的因素[^3]: - **信号完整性测量**:利用示波器等仪器捕捉高速差分对上的电压波动形态,判断是否存在反射、串扰等问题。 - **电源管理审查**:监测供电轨的变化趋势,防止因电流突变引发异常重启现象。 - **环境适应性试验**:针对极端温湿度条件下的表现做极限挑战,保障产品全生命周期内的可靠性。 ```bash # 使用IOMeter进行基本磁盘性能测试的例子 iometer.exe -a -i config_file.icf -o results.csv ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值