java - java static 块 vs static 方法初始化 static 字段

  显示原文与译文双语对照的内容

出于好奇,我测量了 static 块和 static 方法初始值设定项之间的性能。 首先,我在两个单独的java类中实现了上述方法,如下所示:

首先:


class Dummy {


 static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();


 static {


 for(int i=0; i <1000000; ++i) {


 lista.add(new Integer(i));


 }


 }


}



public class First {


 public static void main(String[] args) { 


 long st = System.currentTimeMillis();


 Dummy d = new Dummy();


 long end = System.currentTimeMillis() - st;


 System.out.println(end); 


 }


}



第二:


class Muddy {


 static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();


 public static void initList() {


 for(int i=0; i <1000000; ++i) {


 lista.add(new Integer(i));


 }


 }


}



public class Second {


 public static void main(String[] args) { 


 long st = System.currentTimeMillis();


 Muddy.initList();


 Muddy m = new Muddy();


 long end = System.currentTimeMillis() - st;


 System.out.println(end); 


 }


}



然后我在这个小批量脚本中执行了 ,并将值放在一个文件中。batchFile.bat First Second dum.res.txt

在这里之后,我编写了这一of代码,用来计算泥土值的平均值和标准偏差。

这就是我得到的结果:


First size: 100 Second size: 100


First Sum: 132 Std. deviation: 13


Second Sum: 112 Std. deviation: 9



而且在我的其他机器上也很相似。每次我测试它。

现在我想知道为什么? 我检查了字节码和 Second.class 在 System.currentTimeMillis() 调用之间有一个指令( ( 调用 static initList ( ) ) 。 他们都做同样的事情,但是为什么第一个是慢的? 我仅仅是通过查看字节码来解释它,因为这是我第一次接触到 javap ;我还不明白字节码。

时间: 作者:

我认为 static 块版本比 static 方法版本慢的原因可以能是因为它们获得的JIT优化是不同的。

有关更有趣的信息,请参见这里有趣文章: Java Secret: 是否解释 static 块

作者:

以下是我的猜测的原因:

正在进行的初始化正在创建足够的对象,它导致一个或者多个垃圾回收。

当从 static 块调用初始化时,它在类初始化期间完成,而不是在简单方法执行期间完成。 在类初始化期间,垃圾检测器可以能比在简单方法执行过程中更多的工作。

为了测试这个问题,你可以尝试添加-Xms200m或者它的他的java命令;。

...