System.nanoTime() 直接调用操作系统底层单调高分辨率硬件时钟,如Linux/macOS的CLOCK_MONOTONIC、Windows的QueryPerformanceCounter,不依赖墙钟、不校准、无Java层对象或线程,仅返回用于差值计算的任意起点计数值。

System.nanoTime() 不是“获取”一个现成的高精度计时器,而是直接调用操作系统底层提供的单调、高分辨率硬件时钟源,它本身就是一个轻量级接口,背后没有 Java 层的计时器对象或线程在运行。
它依赖的是内核级单调时钟
在不同系统上,nanoTime() 实际调用的是:
-
Linux/macOS:通常映射到
CLOCK_MONOTONIC(POSIX 标准),该时钟基于硬件计数器(如 TSC —— 时间戳计数器),不受系统时间调整(NTP、手动改时间)影响,只随 CPU 实际运行单调递增; -
Windows:底层调用
QueryPerformanceCounter(QPC),它利用高精度性能计数器(HPET 或 TSC),同样具备纳秒级分辨率和单调性; -
ARM 或虚拟化环境:可能退化为
CLOCK_MONOTONIC_RAW或其他可用计时器,JVM 会尽力选择最稳定、最高频的源。
它不依赖系统墙钟,也不做任何校准
和 System.currentTimeMillis() 完全不同,nanoTime():
- 不读取 RTC(实时时钟)或 NTP 同步后的时间;
- 不关心时区、夏令时、闰秒;
- 起点“任意”——通常是 JVM 启动瞬间的硬件计数值,对用户无意义,只用于差值计算;
- 返回值本身不可格式化、不可转换为日期,仅作减法使用。
分辨率与实际精度由硬件和 OS 共同决定
虽然方法名含 “nano”,但实际分辨率不是固定 1 纳秒:
- 现代 x86 CPU 的 TSC 可达 ~0.3–1 纳秒周期(取决于主频),但 JVM 返回值受 OS 调度、缓存一致性、跨核迁移等影响;
- 典型有效分辨率在 10–100 纳秒 区间,远高于 currentTimeMillis() 的 1–15 毫秒;
- 多次调用差值的标准差通常在几十纳秒内,足够支撑微秒级算法分析或倒计时控制。
它不启动线程、不维护状态、不触发回调
nanoTime() 是一个纯函数式调用:
- 每次调用都直接读取当前硬件计数器值;
- 无内存分配、无锁、无上下文切换开销;
- 单次调用耗时约 10–30 纳秒(视 CPU 和缓存状况),比 currentTimeMillis() 更快更稳。

















