在 JVM 的类加载机制中,准备(Preparation)阶段是链接(Linking)过程的第二步。在这个阶段,JVM 主要完成两件事:为类变量分配内存和为类变量设置默认初始值。 下面我将详细拆解这两个过程的具体实现细节: 一、 内存分配:给“谁”分配?分配到“哪”? 1. 给“谁”分配?(只针对类变量) 在准备阶段,JVM 只为类变量(即被 修饰的变量)分配内存,而不包括实例变量。 类变量:跟随类的加载而分配,全类共享。 实例变量:不会在这个阶段分配内存,它们会在对象实例化( 操作)时,随着对象一起分配在 Java 堆中。 2. 分配到“哪”?(随 JDK 版本的变迁而不同) 根据《Java 虚拟机规范》,这些变量所使用的内存都应当在方法区(Method Area)中进行分配。但是,在 HotSpot 虚拟机的具体实现中,这个位置发生过变化: JDK 6 及之前:静态变量存放在方法区的永久代(PermGen)中。 JDK 7 开始:HotSpot 将字符串常量池和静态变量从永久代中剥离,转移到了 Java 堆(Heap)中。静态变量被存放在与该类对应的 对象的末尾。 JDK 8...