自动装箱使用
Integer.valueOf,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“
java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与
newInteger直接调用不同。因为
Integer.valueOf在调用之前可以快速检查整数值的大小
new Integer,所以
newInteger直接调用要快一些(尽管如果您有很多小整数,它会使用更多的内存)。Java中的分配非常快,并且执行GC的时间与活动的短期对象的数量成正比(即与垃圾的数量不成比例),因此GC也非常快。
但是取决于JVM版本和启用的优化,存在标量替换优化,它在分配短期对象时会产生更大的性能差异(在您的示例中,无法进行优化,因为您正在存储地图中的对象,但在许多其他情况下很有用)。
在最新的JVM版本中,进行了标量替换优化(在1.6.0_18中暂时禁用了转义分析),这意味着可以优化短期对象的分配。在JVM中进行标量替换时,有人制定了一个基准测试,其中有与您相似的代码。结果是使用原语的代码最快,使用显式
newInteger()调用的代码几乎与使用原语的代码一样快,而使用自动装箱的代码要慢得多。这是因为使用自动装箱
Integer.valueOf,并且至少在那时进行了标量替换优化,没有考虑这种特殊情况。从那时起,我不知道优化是否有所改进。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)