【发布时间】:2015-04-12 02:26:54
【问题描述】:
我知道类似的问题之前已经被问过很多次了,但我仍然不确定对象何时符合 GC 条件以及哪种方法更有效。
方法一:
for (Item item : items) {
MyObject myObject = new MyObject();
//use myObject.
}
方法二:
MyObject myObject = null;
for (Item item : items) {
myObject = new MyObject();
//use myObject.
}
我理解:“通过最小化局部变量的范围,您可以提高代码的可读性和可维护性,并减少出错的可能性”。 (约书亚·布洛赫)。
但是性能/内存消耗如何?在 Java 中,当没有对对象的引用时,会收集垃圾。如果有例如100000 个项目,然后将创建 100000 个对象。在方法一中,每个对象都有一个对它的引用 (myObject),因此它们不符合 GC 条件?
在方法二中,每次循环迭代时,您都会从先前迭代中创建的对象中删除引用。所以在第一次循环迭代之后,对象肯定会开始变得合格。
还是在性能和代码可读性和可维护性之间进行权衡?
我误解了什么?
注意: 假设我关心性能并且循环后不需要 myObject。
提前致谢
【问题讨论】:
-
性能可能是一个问题,但编写正确的代码并将变量声明放在循环中要好得多。 然后衡量性能。在确定需要它之前,永远不要“优化”任何东西。其他任何事情都是疯狂的。
-
我认为 GC 足够聪明,可以在需要时在每次循环后清除方法二中的那些对象。我总是更喜欢方法一,声明变量更接近它的使用位置。
-
两个版本都创建了 100000 个对象。它们之间的唯一区别是最后创建的对象在其中一个中不符合 GC 条件。
-
我希望创建它们比 GC 清理要昂贵得多(当然取决于您的对象),那么总体而言 GC 对性能的影响很小。但是,我会尝试一下……如果性能没有可衡量的差异,我不会感到惊讶
-
^ 不,不可能重复,绝对重复。
标签: java performance garbage-collection scope