Java中用static变量记录程序总耗时,本质是借助类加载时初始化、全生命周期共享的特性实现跨方法跨线程累计计时,适合统计JVM或核心类启动至今的累计耗时,但不适用于单次方法精确测量。

Java 中用 static 变量记录程序总耗时,本质是借助类加载时初始化、全生命周期共享的特性,实现跨方法、跨线程(需注意线程安全)的累计计时。它适合统计整个 JVM 实例或某个核心类从启动到当前的累计耗时,但不适用于精确测量单次方法执行时间(那更适合局部变量或 StopWatch)。
用 static long 记录启动时间 + 累计逻辑
最常用方式:定义一个 static 变量保存程序启动时刻(如 System.nanoTime()),再提供一个静态方法返回当前累计耗时。
- 启动时间只赋值一次,通常放在 static 初始化块或
main入口处 - 后续调用统一用
System.nanoTime() - START_TIME计算已过去纳秒数 - 可封装成毫秒、秒等易读单位,并支持重置(谨慎使用)
示例:
public class AppTimer {
private static final long START_TIME = System.nanoTime();
<pre class="brush:php;toolbar:false;">public static long getTotalNanos() {
return System.nanoTime() - START_TIME;
}
public static long getTotalMillis() {
return getTotalNanos() / 1_000_000;
}
public static double getTotalSeconds() {
return getTotalNanos() / 1_000_000_000.0;
}} // 使用:System.out.println("已运行 " + AppTimer.getTotalSeconds() + " 秒");
用 static AtomicLong 实现多线程安全的累加耗时
如果目标不是“从启动到现在”,而是累计多个任务的实际执行时间总和(比如所有数据库查询耗时之和),可用 AtomicLong 做线程安全累加。
- 每次任务开始前记录起始时间,结束后计算差值并
addAndGet累加 - 避免 synchronized 块,性能更好,适合高并发场景
- 注意:这统计的是“所有任务执行时间之和”,不是 Wall-clock 总时长
示例:
public class TaskTimer {
private static final AtomicLong TOTAL_EXEC_TIME = new AtomicLong(0);
<pre class="brush:php;toolbar:false;">public static void recordTask(Runnable task) {
long start = System.nanoTime();
try {
task.run();
} finally {
long duration = System.nanoTime() - start;
TOTAL_EXEC_TIME.addAndGet(duration);
}
}
public static long getTotalMillis() {
return TOTAL_EXEC_TIME.get() / 1_000_000;
}}
注意事项与常见误区
static 变量记录耗时看似简单,但容易踩坑:
- 不要在 static 块里调用可能阻塞或依赖未初始化资源的方法,否则类加载会卡住
-
System.currentTimeMillis() 不适合做总耗时基准——它受系统时钟调整影响(如 NTP 同步),推荐用
System.nanoTime() -
static 变量无法自动感知 JVM 退出,若需优雅关闭并打印最终耗时,应在
Runtime.addShutdownHook中处理 - Web 应用中,static 变量属于 ClassLoader 级别,热部署或多个应用共存时可能有多个副本,不能代表全局总耗时
替代方案:更清晰的职责分离
虽然 static 能实现,但生产环境建议:
- 用 Spring 的
@EventListener(ContextRefreshedEvent.class)记录应用启动完成时刻 - 用 Micrometer 或 Prometheus 暴露
jvm.uptime这类标准指标,比手写 static 更可靠 - 对关键业务链路,优先用 MDC + 日志埋点或分布式追踪(如 SkyWalking),而非静态累加
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











