JVM非确定性的经过时间

时间:2011-10-15 05:27:23

标签: jvm

运行5亿次迭代循环的单线程程序通常需要大约400 ms,有时在2.8 GHz linux计算机上大约需要1200 ms。这在程序中观察到,该程序除了测量循环的经过时间之外什么都不做。这种可变性的原因是什么?

import java.io.PrintWriter;
import java.util.Date;

public class Tester
{
    public static void main(String[] args)
    {
        PrintWriter pw = new PrintWriter(System.out, true);

        Date d0 = new Date();
        long t0 = d0.getTime();

        for (long i = 0; i < 500000000; i++)
            ;

        Date d1 = new Date();
        long t1 = d1.getTime();

        pw.format("%d\n", t1 - t0);   
    }
}

1 个答案:

答案 0 :(得分:2)

垃圾收集例程需要运行一段时间,即使您没有要收集的垃圾。

很容易假设因为你没有分配或取消引用内存,所以你不需要收集垃圾;但是,垃圾收集例程在一个独立的线程中运行,并不检查代码中可能的流量以确定它是否应该运行。

因此,垃圾收集例程启动并找不到要收集的垃圾。这需要一些时间。

此外,您的程序(即整个JVM解释您的类)可能已经被操作系统立即处理某些中断的需要从CPU上交换掉了。这甚至可以在多核系统中发生,具体取决于CPU的核心选择算法。 CPU必须立即处理的项目示例包括将以太网内存缓冲区复制到系统内存中(以防止丢弃数据包),捕获键盘输入等。

简而言之,如果您希望分析意味着什么,那么您必须对基准测试进行真实的统计,因为各种外部项目都会影响您的运行程序的时间。