JVM源码分析之System.currentTimeMillis及nanoTime原理详解
提取关键问题:
- 在mac下发现System.nanoTime()在JDK7和JDK8下输出的值怎么完全不一样
- System.nanoTime()的值很奇怪,究竟是怎么算出来的
- System.currentTimeMillis()为何不是System.nanoTime()的1000000倍
- System.nanoTime() 之间的时间段如何转换成ms
- 在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 <t0
- 如何测试System.nanoTime()和System.currentTimeMillis()性能
解答:
- 在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 <t0
见--》 在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 <t0如何测试System.nanoTime()和System.currentTimeMillis()性能
见--》如何测试System.nanoTime()和System.currentTimeMillis()性能
-->JDK8 Stream 数据流效率分析
PS: 若你觉得可以、还行、过得去、甚至不太差的话,可以“关注”一下,就此谢过!