【问题标题】:System.nanoTime() returns different values between java 7 and java 8System.nanoTime() 在 java 7 和 java 8 之间返回不同的值
【发布时间】:2016-11-26 06:33:26
【问题描述】:

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。

【问题讨论】:

  • 您如何确定这两个程序确实在同一时刻运行?
  • 这个问题是主题性的,公式化的,包含代码。我不明白为什么它会被否决。
  • 我应该更好地形成这个问题。我想知道为什么与 java 7 相比,java 8 上的 nanoTime 不准确。我更新了问题以包含 gdate 的输出。

标签: java nanotime


【解决方案1】:

System.nanoTime()javadoc 说,

Java 虚拟机实例中此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。

只有在计算同一 Java 虚拟机实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。

您正在比较不同 JVM 实例(以及不同来源和版本)的结果。那没有意义。只要保留 API 中指定的行为,实现在 Java 版本之间更改是完全合法的。

【讨论】:

  • 你能告诉我在这种情况下起源是什么意思吗?
  • @Abhishek 一个由 JRE 计算并保证按照文档中所述执行的值,事实上大多数操作系统仅提供 +/- 15 毫秒的精度。 JVM 还只保证nanoTime至少currentTimeMillis() 一样准确。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2014-12-19
  • 2015-09-03
相关资源
最近更新 更多