Java 优化:局部变量与实例变量

Jav*_*Man 5 java garbage-collection compiler-optimization

在Java中,如果我有很多本地对象,如果我将它们定义为实例变量,它会运行得更快吗?例如,如果我的 func1() 被多次调用(比如在一个循环中),那么每次调用该函数时,JVM 是否会继续实例化 list2 并进行垃圾收集?我是否应该重用相同的 list1 对象来防止垃圾收集和实例化开销?

class A {
   List list1 = new ArrayList();
   private void func1() {
      list1.clear();
      // add new objects list1

      List list2 = new ArrayList();
      // add new objects to list2
   }
}
Run Code Online (Sandbox Code Playgroud)

优化器是否足够聪明,可以跳过垃圾收集并自动重用对象?

Bru*_*owe 1

我用jdk1.6写了一个小测试程序,如下

结果:
* dostuff 594ms(创建本地)
* dostuff2 58ms(使用实例)

public class Test {

static long counter=0;
public static void main(String[] args) {
    long t1  = System.nanoTime();
    Test test = new Test();
    for (int i=0;i<1000000000;i++) {
        test.doStuff();//or dostuff2
    }
    long t2  = System.nanoTime();
    System.err.println((t2-t1)/1000000);
    System.err.println(counter); // to check it wasnt optimised away
}

private void doStuff() {
    List l = new ArrayList();
    if (l!=null) {
        counter++;
    }
}

List l2 = new ArrayList();
private void doStuff2() {
    if (l2!=null) {
        counter++;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

因此,正如人们所期望的那样,该实例似乎比使用本地实例更快

然而,似乎每十亿个项目可以节省大约 0.5 秒,至少在我的电脑上是这样,所以您确实需要性能增益来证明它的合理性