为何Java枚举与静态常量采用按需加载而非预加载?
关于Java枚举加载时机的疑问与解析
枚举的创建与加载逻辑
- 枚举的首次创建时机:当枚举类首次被加载时。
- 枚举类的首次加载时机:在需要的时候。
- JVM会在枚举类加载阶段完成枚举类型的实例化
- 枚举值是运行时在枚举类加载的初始化阶段创建的一次性常量
- 结合JVM的“加载、链接与初始化”机制可以明确:类的加载操作是在首次被需要时执行的。
问题背景
我之前和某篇帖子里的部分人有同样的错误认知:认为枚举会在程序第一行执行前就被加载到Metaspace中。该帖子还提到一个场景:当类中包含枚举或私有静态常量字段时,首次并发创建该类的多个实例,为保证每个对象获取到相同的枚举/静态常量实例,类会产生同步性能损耗。
核心疑问
既然编译器在程序执行前已经掌握了所有代码信息,为什么要选择在首次需要时才加载常量与枚举?是不是因为无法确定相关代码是否会被执行,以此来节省内存空间?
内容的提问来源于stack exchange,提问作者Delark
相关产品推荐
相关产品推荐

