System.nanoTime()在机器休眠时是否停止计时?技术问题求助
机器休眠时System.nanoTime()停止计时引发的Bug
我正在追踪一个Bug:当机器进入深度休眠状态时,System.nanoTime()会停止计时,但System.currentTimeMillis()不受影响,两者的差值会随休眠时长增加。
以下是最小复现示例,代码会持续追踪System.currentTimeMillis()与System.nanoTime()转换为毫秒后的差值:
public static void main(String[] args) throws Exception { while (true) { long epoch = System.currentTimeMillis(); System.out.println(new Date(epoch) + " " + (epoch - TimeUnit.NANOSECONDS.toMillis(System.nanoTime()))); Thread.sleep(1000); } }
我的运行环境:
- MacBook Pro(macOS 15.5)
- 通过SdkMan安装的Java 21.0.2-amzn
复现步骤:
- 运行程序并让其循环一段时间
- 点击苹果菜单选择“睡眠”使笔记本进入休眠模式
- 等待一段时间后唤醒电脑
- 检查输出的差值是否增加
示例输出显示,经过15秒休眠后,差值几乎增加了相同的时长:
... Wed Jun 11 00:21:20 BRT 2025 1749394409334 Wed Jun 11 00:21:21 BRT 2025 1749394409334 Wed Jun 11 00:21:36 BRT 2025 1749394423732 Wed Jun 11 00:21:37 BRT 2025 1749394423732 ...
根据Java官方文档描述:
返回值表示自某个固定但任意的起始时间以来的纳秒数[...]。同一Java虚拟机实例中所有调用此方法的地方都使用相同的起始点[...]
但实际测试情况与这段描述不符。有没有人遇到过该问题?我是否遗漏了什么细节?
内容的提问来源于stack exchange,提问作者Juan Lopes
相关产品推荐
相关产品推荐

