美文网首页JVM
JVM之System.currentTimeMillis及nan

JVM之System.currentTimeMillis及nan

作者: 光小月 | 来源:发表于2020-04-23 09:53 被阅读0次

    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 <t0
    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)}));
    

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

    相关文章

      网友评论

        本文标题:JVM之System.currentTimeMillis及nan

        本文链接:https://www.haomeiwen.com/subject/qclnihtx.html