Java中static变量生命周期与类完全绑定:从类加载时在元空间分配内存并设默认值、初始化阶段赋值且仅一次,到类卸载时才清除;不依赖对象,不由GC回收,仅随类消亡而释放。

Java 中 static 变量的生命周期与类本身完全绑定——它从类被 JVM 加载时开始存在,到类被卸载时才真正结束。
static 变量什么时候被创建
当 JVM 首次主动使用该类(比如 new 实例、调用静态方法、访问静态字段),就会触发类加载流程。在准备阶段,JVM 在元空间(JDK 8+)为 static 变量分配内存并设默认值(如 int 为 0,引用类型为 null);紧接着在初始化阶段,按代码顺序执行赋值语句(如 static int count = 1;),且整个过程只发生一次。
static 变量存放在哪、由谁管理
它不存于堆内存的对象中,也不随栈帧进出,而是长期驻留在元空间(原方法区)。这个区域由 JVM 类加载子系统统一管理,不是 GC 的常规目标。即使所有对象都被回收,只要类还活着,static 变量就一直存在且可访问。
static 变量什么时候消失
类卸载是极少见的操作,通常只发生在以下情况:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 整个应用程序退出,JVM 关闭
- 使用自定义类加载器(如 Tomcat 的 WebAppClassLoader),且该加载器被回收、所加载类不再被任何强引用持有
- OSGi 等支持模块热插拔的环境中显式卸载 Bundle
此时,类的元数据连同其全部 static 变量一并从元空间清除。普通场景下,static 变量会持续到进程终止。
常见误解澄清
很多人误以为 static 变量“被回收了”,其实只是发生了以下情况:
- 把 static 引用设为 null —— 变量本身还在,只是指向的对象可能被 GC
- Web 应用重启后值重置 —— 是新类加载器加载了新类,旧类已卸载,不是“清空”而是“重建”
- 试图在方法内声明 static 变量 —— 编译直接报错,Java 不允许局部 static 变量
它的存续不由引用计数或作用域控制,只取决于类是否仍在 JVM 中存活。

















