静态变量在jdk7和jdk8中均位于堆中:jdk7将其从永久代移入堆,永久代仅存类元数据;jdk8取消永久代,改用元空间存储类信息,静态变量仍驻堆,由gc统一管理。

静态变量在JDK7和JDK8中都不再位于方法区的物理实现里——JDK7把它移进了堆,JDK8延续这一设计,并彻底取消了方法区的永久代实现。
JDK7:静态变量从永久代搬进堆
永久代(PermGen)仍存在,但只保留类元数据(如方法字节码、符号引用、运行时常量池),而所有静态变量(包括引用本身和所指向的对象)全部迁入Java堆。例如:
public static Map
该cache字段的存储槽(field slot)和new出的HashMap实例,都分配在堆中。Class对象也首次移到堆,静态变量作为其隐式字段一同存放。
JDK8:永久代消失,静态变量稳居堆,元空间不存静态数据
永久代被完全移除,取而代之的是基于本地内存的元空间(Metaspace)。元空间只存类结构信息(Klass、常量池、字段/方法描述符等),不包含任何静态变量。所有static字段仍随Class对象驻留在堆中,GC可统一管理其生命周期——只有当类被卸载(ClassLoader被回收)时,其静态引用才可能被清除。
为什么这个变化重要
它直接决定OOM类型和排查路径:
• JDK7常见 java.lang.OutOfMemoryError: Java heap space,需dump堆分析静态集合引用链;
• JDK8后,java.lang.OutOfMemoryError: Metaspace 说明是类元数据膨胀,和静态变量无关;
• 调优时,JDK8必须分开设置堆参数(-Xms/-Xmx)和元空间参数(-XX:MaxMetaspaceSize)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











