JVM之System.currentTimeMillis及nanoTime原理详解

JVM源码分析之System.currentTimeMillis及nanoTime原理详解

提取关键问题:

  1. 在mac下发现System.nanoTime()在JDK7和JDK8下输出的值怎么完全不一样
  2. System.nanoTime()的值很奇怪,究竟是怎么算出来的
  3. System.currentTimeMillis()为何不是System.nanoTime()的1000000倍
  4. System.nanoTime() 之间的时间段如何转换成ms
  5. 在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1
  6. 如何测试System.nanoTime()和System.currentTimeMillis()性能

解答:

    1. 在mac下发现System.nanoTime()在JDK7和JDK8下输出的值怎么完全不一样
 在mac中,JDK8下多了一个__APPLE__宏下定义的实现, 在linux下JDK7和JDK8的实现都是一样的
  • System.nanoTime()的值很奇怪,究竟是怎么算出来的
这是个native的方法,应该底层使用C++实现的,  找代码底层是一些库文件,librt.so.1、librt.so,
最终会在系统启动初始化的时候设置,记录了启动的时间。
因此nanoTime其实算出来的是一个相对的时间,相对于系统启动的时候的时间
  • System.currentTimeMillis()为何不是System.nanoTime()的1000000倍
  • Java里currentTimeMillis的实现
new Date(0).getTime() 其实是就是1970/01/01 08:00:00
而new Date().getTime()是返回的当前时间
new Date().getTime() - new Date(0).getTime()  其实就是当前时间距离1970/01/01 08:00:00有多少毫秒
而System.currentTimeMillis()返回的正好是这个值,
也就是说System.currentTimeMillis()就是返回的当前时间距离1970/01/01 08:00:00的毫秒数。

System.currentTimeMillis() 与 System.nanoTime()计算方式不一致, 所以System.currentTimeMillis()为何不是System.nanoTime()的1,000,000倍。
  • System.nanoTime() 之间的时间段如何转换成ms
使用TimeUnit 枚举类进行转换
long start = System.nanoTime();
try {
    Thread.sleep(5000);
} catch (InterruptedException e) {
   e.printStackTrace();
}
long period = System.nanoTime() - start;
System.out.println(String.format(
      "period(nanoseconds): %d, period(seconds): %d", new Object[]{
       period, TimeUnit.NANOSECONDS.toSeconds(period)}));
  • 在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 见--》 在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1

  • 如何测试System.nanoTime()和System.currentTimeMillis()性能
    见--》如何测试System.nanoTime()和System.currentTimeMillis()性能
    -->JDK8 Stream 数据流效率分析

PS: 若你觉得可以、还行、过得去、甚至不太差的话,可以“关注”一下,就此谢过!

你可能感兴趣的:(JVM之System.currentTimeMillis及nanoTime原理详解)