ree*_*nes 1 java performance autoboxing caching
根据Java语言规范第5.1.7节,Java将-c8 Integer从-128 缓存到127以进行性能优化.
因此,当您a == b与缓存范围中的a&bIntegers 进行比较时,即使它们是不同的对象,它也会返回true.
从机制上讲,这种缓存带来了哪些性能优势?根据这个答案,"目的主要是为了节省内存,由于更好的缓存效率,这也可以带来更快的代码." 它如何导致更快的代码?我如何使用此功能来提高我编写的实际代码的性能?
它与类中的以下方法有什么关系IntegerCache吗?
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)
性能优势与之无关==.真正的原因是缓存允许valueOf在重复加框相同的"小"整数时避免创建大量对象. Integer对象占用空间(至少16个字节).创建大量垃圾收集器意味着垃圾收集器需要更频繁地运行.
我的理解是Java团队对实际应用程序进行了大量分析,并得出结论,Integer缓存是一个值得优化的.
(我说它与之无关的原因==是你不能依赖于==为Integer对象工作.因此,任何执行此操作的代码......如果不确保整数在指定的范围内......都是错误的.如果你进行范围检查以确保数字在范围内,那么你可能会花费更多的钱,而不是通过使用来节省==.)
"......由于更好的缓存效率,这也可以带来更快的代码." 它如何导致更快的代码?
他们所讨论的缓存效率是大多数现代处理器用来处理CPU和内存速度不匹配的硬件级内存缓存.如果应用程序只有一个Integer表示数字的对象,1并且该数字经常出现,那么保存1对象的内存地址在(内存)高速缓存中的可能性就会增加.缓存命中意味着更快的代码.
它与IntegerCache类中的以下方法有什么关系吗?
呃......是的.