在Java中经常复制引用(复制到本地堆栈变量,而不是使用实际的成员变量)会导致性能损失?

时间:2015-01-05 18:54:03

标签: java reference copying

我想知道在每个对象的方法中将成员变量复制到本地堆栈变量是否会导致性能下降?

class X {
   Another instanceOfAnother;

   void foo() {

      Another local = instanceOfAnother; //Would like to know if this causes a performance hit
                                         //with regards to any garbage collection
                                         //infrastructure

   }
}

3 个答案:

答案 0 :(得分:1)

对象引用只是值,就像int一样。 (事实上​​,我认为它们与int的大小相同,但不要引用我的信息。[我不认为JLS或VM规范说明了,但是{{3声称它们在32位CPU上为32位,在64位CPU上为64位。])Java使用堆栈管理局部变量,因此它们相当有效。如果您不担心将intlong从变量复制到变量,我不会担心将对象引用从变量复制到变量。

答案 1 :(得分:1)

如果您要在方法中经常使用(读取)实例变量,那么将其值复制到局部变量可能会更好。

读取实例字段意味着获取this的值(也将在堆栈中),取消引用它,并访问引用对象的字段。

读取局部变量意味着查看堆栈中局部变量表中的相应条目。

答案 2 :(得分:0)

它并没有真正导致性能损失,因为它不是复制实际对象(位于堆上),而是复制对象的引用,通常是整数或长整数。

不要担心GC,垃圾收集过程中唯一会改变的是对象的额外引用,所以如果你在instanceOfAnother = null;时说:local仍然指向GC将无法删除对象的对象,因为仍有一个引用(local)指向它。

但是这一切都处于如此低的水平和小规模,你不必担心这样做,除非你真的需要从系统中获得所有可能的性能提升。但在这种情况下,您应该查看本地语言,例如C ++而不是Java。