You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8及以上版本中static变量、方法、静态内部类的存储位置

Java 8中静态成员与静态内部类的存储位置解析

一、静态方法(Static Method)

静态方法属于类的元数据范畴,在Java 8中,类的元数据(包括方法字节码、字段签名、类结构信息等)存储在**本地内存(Native Memory)的元空间(Metaspace)**中,而非Java堆。它是类定义的一部分,和类的其他元数据绑定,只有当类被卸载时,对应的元数据才会被释放。

二、静态变量(Static Variable)

从Java 8开始,静态变量(比如示例中的staticInt)被移至Java堆中。具体来说,静态变量会作为对应类的Class实例的一部分存储在堆内——当类被JVM加载后,会生成一个Class对象存放在堆中,该类的所有静态变量都依附于这个Class对象存在。

关于垃圾回收的争议:Java 7及以前,静态变量存放在永久代(方法区的实现),永久代回收阈值极高,几乎不会被回收,因此有“静态变量无法被GC回收”的说法。但Java 8改用元空间后,静态变量到了堆里,只要类的Class对象失去所有引用(比如自定义类加载器被回收,且该类无其他引用),静态变量就会随Class对象一起被GC回收。不过普通应用中类多由系统类加载器加载,Class对象几乎不会被回收,所以日常开发中很少见到这种场景。

三、静态内部类(Static Inner Class)

静态内部类本质是独立的顶级类,只是命名上依附于外部类。它的元数据(方法字节码、类结构等)同样存储在本地内存的元空间中;而它的Class实例以及自身的静态变量(如果有),遵循普通类的规则:Class实例在Java堆,静态变量作为Class实例的一部分也在堆中。静态内部类的生命周期和外部类无关,只有当它的Class对象失去所有引用时,才会被GC回收。


参考示例代码:

public class Example {
    public static int staticInt = 5; // <- 静态变量

    public static class StaticInnerExample { // <- 静态内部类
    }

    public static void hello() { // <- 静态方法
        System.out.println("hello");
    }
}

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:54:22