重用引用是否有助于Java中的GC

时间:2015-07-16 16:02:09

标签: java garbage-collection

我想比较以下两种方法:

// We reuse the previously created object copy
public double first(double[] input, double[] copy) {
  copy = Arrays.copyOf(input, input.length);
  Arrays.sort(copy);
  return copy[0];
}

// We create the object copy inside the method
public double second(double[] input) {
  double[] copy = Arrays.copyOf(input, input.length);
  Arrays.sort(copy);
  return copy[1];
}

first会比second更快吗?

垃圾收集器的行为如何?

first这样的编码对大型项目的影响是什么?

如果致电first(input,null)会怎样?

2 个答案:

答案 0 :(得分:3)

  

首先会比第二快吗?

没有

  

垃圾收集器的行为如何?

它将完成它的工作:检查是否有任何对象不再引用的对象引用,或者检查是否有两个或更多对象引用仅由它们自己引用,因此它将扫描它们。

这里要小心。在第一种情况下,您将创建一个新的对象引用并将其存储在double[] copy中,并且该引用将在方法结束时进行GCed。请记住Java is pass by value。因此,在两段代码中,GC的行为都相同:存储在double[] copy中的对象引用对于方法是本地的,因此可能在执行该方法后将引用标记为GC。

  

首先编码对大型项目的影响是什么?

它主要以意见为基础。但我会说第二段代码更可取。第一个导致混淆,因为您使用新的对象引用重新分配参数的值,尽管项目的大小,您应该避免这种情况。

  

如果致电first(input,null)会怎样?

运行代码并自己查看= /

注意:您不会在这些代码段中重复使用任何对象引用。

答案 1 :(得分:0)

两种方法每次运行时都会创建一个新对象。它们将保留在内存中,直到GC决定删除它们。

如果不需要,您应该考虑对输入数组进行排序或将缓冲区数组作为您在构造函数上创建的对象属性。