要理解方法区(Method Area)、永久代(PermGen)和元空间(Metaspace)的区别,最核心的切入点是区分“JVM规范”和“具体实现”。 简单来说:方法区是 JVM 的“规范(接口)”,而永久代和元空间是不同 JDK 版本下对该规范的“实现(实现类)”。 以下是详细的区别和演进过程: --- 1. 方法区(Method Area)—— “规范标准” 定义:它是《Java虚拟机规范》中定义的一个逻辑区域。 作用:用于存储已被虚拟机加载的类信息(Class Metadata)、常量、静态变量、即时编译器(JIT)编译后的代码等数据。 特点:JVM 规范并没有规定方法区要在堆上还是堆外,也没有规定用什么技术来实现,只要能实现上述功能即可。这就像 Java 中的 接口,它只规定了要有什么功能。 2. 永久代(PermGen)—— “旧版本的实现(JDK 7 及以前)” 定义:在 JDK 8 之前,HotSpot 虚拟机使用永久代来实现方法区。 内存位置:占用 JVM 堆内存(Heap)的一部分,逻辑上独立,物理上与老年代连续。 配置参数:通过 和 来设置大小。 致命缺点:...