JVM源碼分析之System.currentTimeMillis及nanoTime原理詳解
提取關(guān)鍵問(wèn)題:
- 在mac下發(fā)現(xiàn)System.nanoTime()在JDK7和JDK8下輸出的值怎么完全不一樣
- System.nanoTime()的值很奇怪,究竟是怎么算出來(lái)的
- System.currentTimeMillis()為何不是System.nanoTime()的1000000倍
- System.nanoTime() 之間的時(shí)間段如何轉(zhuǎn)換成ms
- 在Java中使用System.nanoTime()時(shí),為什么要使用t1-t0 <0,而不是t1 <t0
- 如何測(cè)試System.nanoTime()和System.currentTimeMillis()性能
解答:
- 在mac下發(fā)現(xiàn)System.nanoTime()在JDK7和JDK8下輸出的值怎么完全不一樣
在mac中,JDK8下多了一個(gè)__APPLE__宏下定義的實(shí)現(xiàn), 在linux下JDK7和JDK8的實(shí)現(xiàn)都是一樣的
- System.nanoTime()的值很奇怪,究竟是怎么算出來(lái)的
這是個(gè)native的方法,應(yīng)該底層使用C++實(shí)現(xiàn)的, 找代碼底層是一些庫(kù)文件,librt.so.1、librt.so,
最終會(huì)在系統(tǒng)啟動(dòng)初始化的時(shí)候設(shè)置,記錄了啟動(dòng)的時(shí)間。
因此nanoTime其實(shí)算出來(lái)的是一個(gè)相對(duì)的時(shí)間,相對(duì)于系統(tǒng)啟動(dòng)的時(shí)候的時(shí)間
- System.currentTimeMillis()為何不是System.nanoTime()的1000000倍
- Java里currentTimeMillis的實(shí)現(xiàn)
new Date(0).getTime() 其實(shí)是就是1970/01/01 08:00:00
而new Date().getTime()是返回的當(dāng)前時(shí)間
new Date().getTime() - new Date(0).getTime() 其實(shí)就是當(dāng)前時(shí)間距離1970/01/01 08:00:00有多少毫秒
而System.currentTimeMillis()返回的正好是這個(gè)值,
也就是說(shuō)System.currentTimeMillis()就是返回的當(dāng)前時(shí)間距離1970/01/01 08:00:00的毫秒數(shù)。
System.currentTimeMillis() 與 System.nanoTime()計(jì)算方式不一致, 所以System.currentTimeMillis()為何不是System.nanoTime()的1,000,000倍。
- System.nanoTime() 之間的時(shí)間段如何轉(zhuǎn)換成ms
使用TimeUnit 枚舉類進(jìn)行轉(zhuǎn)換
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()時(shí),為什么要使用t1-t0 <0,而不是t1 <t0
見(jiàn)--》 在Java中使用System.nanoTime()時(shí),為什么要使用t1-t0 <0,而不是t1 <t0如何測(cè)試System.nanoTime()和System.currentTimeMillis()性能
見(jiàn)--》如何測(cè)試System.nanoTime()和System.currentTimeMillis()性能
-->JDK8 Stream 數(shù)據(jù)流效率分析
PS: 若你覺(jué)得可以、還行、過(guò)得去、甚至不太差的話,可以“關(guān)注”一下,就此謝過(guò)!