Clear Sky Science · zh
虚拟线程与垃圾收集对电池供电物联网设备上 Java 应用能效的影响
为什么微小设备及其电池重要
从健身手环到工厂中的无线传感器,越来越多我们周围的物件实际上是运行在小型电池上的微型计算机。当这些电池耗尽时,会带来成本、麻烦和电子废弃物。本文研究了一个令人意外但很有效的杠杆——不是新的芯片或电池化学,而是更智能的软件。以智能手表风格的设备为测试用例,作者展示了现代 Java 编程风格如何在不更改硬件的情况下,将电池寿命大致延长约 40%。
日常软件如何悄悄浪费能量
许多电池供电设备的大部分时间都在等待:等待心跳被读取、等待按键被按下,或等待一条消息通过 Wi‑Fi 发送。传统的 Java 程序通过为每个活动使用一个操作系统线程以及简单的“做完再等”方式来处理这些任务。虽然这对程序员很方便,但它会让处理器在没有有用工作的情况下保持唤醒,并且还会在 Java 回收未使用内存时触发突然的工作突发。在插着电的手机或笔记本上,这通常不明显。但在需要依靠小电池全天运行的微型手表上,这些额外的唤醒和停顿会悄悄消耗运行时间。
一种新的并发方式
现代 Java 增加了两种关键工具,改变了这种局面。第一是“虚拟线程”,它允许 Java 运行时在仅有少数真实硬件线程之上调度数千个轻量级任务。当任务在等待网络回复或传感器读数时,可以廉价地将其挂起,而不会占用处理器。第二是新一类“低延迟”垃圾回收器,如 ZGC,它把工作分散到很小的时间片里,而不是长时间停止整个程序。二者结合使芯片能够更频繁且更长时间进入深度睡眠,这是可用的最低功耗状态。设备不再一直处于半唤醒状态,而是短暂唤醒工作,然后迅速回到休眠。

两个智能手表的对比
为了观察这种方法在实践中的效果,研究人员构建了同一款简单智能手表应用的两个版本。两个版本都周期性读取心率数据并通过 Wi‑Fi 将其发送到云服务,这是可穿戴设备和其他物联网设备中的常见模式。第一个版本使用较老的阻塞式代码,采用传统线程和默认垃圾回收。第二个版本采用基于虚拟线程和 ZGC 回收器的事件驱动异步风格。硬件、电池和工作负载保持相同:一块带 Wi‑Fi 模块的 ARM Cortex‑M4 开发板,由 1000 mAh 锂聚合物电池供电,连续运行 24 小时,同时精密仪器记录电流消耗和处理器活动。
电源测量揭示了什么
传统设计的表现像一个焦虑不停踱步的人:处理器约 85% 的时间处于活动状态,即便在等待网络时也是如此,设备只能进入浅睡眠状态。空闲电流徘徊在约 50 毫安,在网络使用和内存清理时出现高于 250 毫安的尖峰。因此电池大约在七小时内耗尽。相比之下,现代设计更像短跑运动员:短时间高效工作后深度休息。非阻塞网络调用和基于定时器的唤醒使芯片约 70% 的时间处于深度睡眠,空闲电流接近 5 毫安,功率曲线也更平滑。平均电流降至约 100 毫安,实测电池寿命增加到大约十小时——约 42% 的提升。

为更环保设备带来的实用教训
除了这款智能手表之外,研究提炼出对任何构建电池供电设备的人都适用的一般性教训。事件驱动的异步设计,结合轻量级通信方式和谨慎的调度,使设备在活动间隙真正处于关闭状态。现代 Java 特性使编写此类代码更容易,同时不牺牲安全性或可移植性,测试表明数百个任务也只带来适度的额外电流开销。换言之,能效不仅仅是选择合适的芯片——更是编写将睡眠时间视为最高效能体现的软件。对于智慧城市、医疗监测和家庭传感器,这种思路可以直接转化为更少的电池更换、更低的成本和更少的废弃物。
引用: Shanjai Kumar, S., Sanjai, B.N., Etheeswar Kaarthi, S. et al. Impact of virtual threads and garbage collection on energy efficiency of Java applications for battery powered IoT devices. Sci Rep 16, 13507 (2026). https://doi.org/10.1038/s41598-026-40112-6
关键词: 物联网能效, 电池寿命, Java 虚拟线程, 低功耗软件, 智能手表设备