【发布时间】:2013-07-21 04:23:47
【问题描述】:
q(除此之外 - 我不确定对于已创建但未存储在变量中的对象该术语是什么)。
我真的不知道如何很好地表达我的问题,所以我将说明它。
示例一,声明了两个对象:
Random random = new Random();
for (int i = 0; i < 10000000; i += 1){
Integer integer = new Integer(random.nextInt());
String string = integer.toString();
}
仅声明一个对象的示例二:
Random random = new Random();
for (int i = 0; i < 10000000; i += 1){
String string = (new Integer(random.nextInt())).toString();
}
在第二个例子中,仍然创建了 Integer 对象,但它在内存中的位置没有保存(我认为)。我知道将对象创建减少一个似乎微不足道,但是在具有许多迭代的大循环中,将对象引用减半肯定是有益的。这种技术是否可以节省内存(即最小化垃圾收集)?
编辑:更改了示例以更好地说明问题。
【问题讨论】:
-
可能你想展示一个比这更好的例子。
-
这两种情况都会创建完全相同数量/类型的对象。为了内存使用,局部变量在这里是无关紧要的。此外,使用
Integer.valueOf(5)会“更好”,因为它通常会使用缓存并完全避免创建新的 Integer 对象(关于这个主题有很多 SO 问题)。 -
虽然这里有一个 subtle 问题,因为局部变量是 GC 根(尽管对于有问题的小型不可变 Integer 类型来说,这非常没有实际意义) ,如果这些变量出现在循环中,则这是无关。 完全相同数量/类型的对象被创建;变量和额外的赋值都没有“添加”新对象。
-
这里的简单解决方案是完全避免创建 Integer,您不需要它。然后,您可以消除创建字符串的需要(取决于您使用的内容),并且您根本不会创建任何垃圾。