【问题标题】:In Java does frequent copying of references (copying to local stack variables, instead of using the actual member variable), cause a performance hit?在 Java 中频繁复制引用(复制到本地堆栈变量,而不是使用实际的成员变量)会导致性能下降吗?
【发布时间】:2015-01-05 18:54:03
【问题描述】:

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

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

   }
}

【问题讨论】:

  • JIT 会优化,我声称。

标签: java reference copying


【解决方案1】:

对象引用只是值,就像ints 一样。 (我认为它们的大小实际上与ints 相同,但不要引用我的话。[我不认为 JLS 或 VM 规范说,但 this answer 声称它们是 32 位上的 32 位位 CPU 和 64 位 CPU 上的 64 位。])Java 使用堆栈管理局部变量,因此使用它们相当有效。如果您不担心将intlong 从一个变量复制到另一个变量,我就不用担心将一个对象引用从一个变量复制到另一个变量。

【讨论】:

    【解决方案2】:

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

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

    读取一个局部变量意味着在堆栈上的局部变量表中查看其对应的条目。

    【讨论】:

    【解决方案3】:

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

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

    但这一切都在如此低的级别和小规模上,您不必担心这样做,除非您真的需要从系统中获得的所有可能的性能提升。但在这种情况下,您或许应该考虑使用 C++ 等原生语言而不是 Java。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2018-02-15
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多