2

System.nanoTime()同じコードをコンパイルして Java 7 と Java 8 に対して実行すると、異なる値が返されます。

このコード片:

public class nanoTime
{
    public static void main(String... args)
    {
      System.out.println("Found JVM: "
          + " " + System.getProperty("java.vm.vendor")
          + " " + System.getProperty("java.version")
          + " " + System.getProperty("java.vm.name")
          );
      System.out.println("time is "+ System.nanoTime());
    }
}

これをJava 7で印刷します

~ gdate +%s%N && javac7-oraclejdk nanoTime.java && java7-oraclejdk nanoTime
1480143769271605000
Found JVM:  Oracle Corporation 1.7.0_80 Java HotSpot(TM) 64-Bit Server VM
time is 1480143769807547000

そしてこれはJava 8で

~ gdate +%s%N && javac nanoTime.java && java nanoTime
1480143724152650000
Found JVM:  Oracle Corporation 1.8.0_92 Java HotSpot(TM) 64-Bit Server VM
time is 527819867675375

なぜ、どのようにこれが起こるのですか?

実行環境はmac Sierraです。

4

1 に答える 1

7

System.nanoTime()javadoc によると、

Java 仮想マシンのインスタンスでは、このメソッドのすべての呼び出しで同じオリジンが使用されます。他の仮想マシン インスタンスは別のオリジンを使用する可能性があります。

このメソッドによって返される値は、Java 仮想マシンの同じインスタンス内で取得された 2 つのそのような値の差が計算された場合にのみ意味があります。

異なる JVM インスタンス (および異なるオリジンとバージョン) 間で結果を比較しています。それは意味がありません。API で指定された動作が維持される限り、Java バージョン間で実装を変更することは完全に合法です。

于 2016-11-26T06:36:55.323 に答える