JVM 内存模型
JVM 在执行 Java 程序时将内存划分为若干区域,理解这些区域是排查内存问题与性能瓶颈的基础。
运行时数据区
堆(Heap) 是所有线程共享的内存区域,几乎所有对象实例与数组都在此分配,也是 GC 主要管理的区域。虚拟机栈(Stack) 线程私有,每次方法调用创建一个栈帧,存储局部变量表、操作数栈与方法返回地址。方法区(Metaclass) 存储类元信息、常量池、静态变量与 JIT 编译产物,Java 8 后由元空间(Metaspace)实现,使用本地内存。
对象生命周期
对象经历 created -> in-use -> invisible -> unreachable -> collected -> finalized 阶段。当没有 GC Roots(栈引用、静态引用、JNI 引用等)指向对象时,它进入不可达状态,等待回收。
类加载过程
类加载分为五个阶段:加载(读取字节码)、验证(检查字节码合法性)、准备(为静态变量分配内存并设零值)、解析(符号引用替换为直接引用)、初始化(执行 <clinit>)。new、getstatic、putstatic 等指令会触发初始化。
字节码查看与 GC 基础
可使用 javap -c -p ClassName 反编译查看字节码与常量池。GC 通常基于可达性分析判定对象存活,采用分代收集思想:新生代用复制算法,老年代用标记-整理或标记-清除,常见组合有 Parallel、CMS、G1、ZGC。