答案是方法区(jdk 8+为元空间),因为静态变量属于类元数据,随类加载而分配且全局唯一;基本类型值和引用类型变量槽均存于此,但引用所指对象实体仍在堆中。

Java 中用 static 修饰的变量(即类变量)存储在方法区(Method Area),JDK 8 及以后版本中具体位于元空间(Metaspace)。
为什么不是堆或栈?
静态变量属于类本身,不依赖对象实例存在。它随类加载而分配内存,且整个 JVM 中只有一份,被所有线程和所有实例共享。堆内存用于存放对象实例(包括实例变量),栈内存用于存放局部变量和方法调用帧,都不符合“类级别、全局唯一、长期存在”的特性。
基本类型和引用类型的静态变量,存放位置一样吗?
是的,变量本身的存储位置一致——都在方法区(元空间):
-
基本类型(如
static int count):值直接存于方法区; -
引用类型(如
static List<string> list</string>):变量槽(即list这个引用)存于方法区,而它所指向的对象实体(如 new 出的 ArrayList)仍存于堆内存。
生命周期和可见性特点
静态变量的生命周期与类绑定:
- 类加载时初始化(按声明顺序,未显式赋值则取默认值);
- 只要类未被卸载(绝大多数情况下不会卸载),静态变量就一直存在;
- 所有线程看到的是同一份数据,因此多线程访问时需注意同步问题。
常见误区提醒
不要把“全局区”理解为 C/C++ 中的传统概念。Java 规范中没有“全局区”一说,所谓“全局区”实际是开发者对方法区/元空间的通俗称呼;也不要误以为 static 变量在堆的“永久代”——JDK 8 已彻底移除永久代,改用本地内存实现的元空间。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











