JVM 内存模型与 GC 机制
2025年12月2日大约 1 分钟
JVM 内存模型与 GC 机制
深入理解 JVM 是 Java 程序员进阶的必经之路。
1. 运行时数据区
- 堆 (Heap): 存放对象实例,GC 的主要区域。分为新生代(Eden, S0, S1)和老年代。
- 栈 (Stack): 存放方法调用栈帧(局部变量、操作数栈)。线程私有。
- 方法区 (Method Area): 存放类信息、常量、静态变量。Java 8 后称为元空间(Metaspace)。
- 程序计数器: 记录当前线程执行的字节码行号。
- 本地方法栈: 为 Native 方法服务。
2. 垃圾回收算法
- 标记-清除: 标记垃圾,直接回收。缺点:内存碎片。
- 复制算法: 将内存分两块,每次只用一块,回收时将存活对象复制到另一块。优点:无碎片;缺点:内存减半。用于新生代。
- 标记-整理: 标记垃圾,将存活对象向一端移动。用于老年代。
3. 垃圾收集器
- Serial: 单线程,适合客户端。
- Parallel Scavenge: 吞吐量优先,JDK 8 默认。
- CMS: 响应时间优先,减少停顿。
- G1: 面向服务端的全功能收集器,将堆划分为多个 Region,可预测停顿时间。JDK 9+ 默认。
4. JVM 调优常用参数
-Xms: 初始堆大小。-Xmx: 最大堆大小(通常设置与 -Xms 相同,避免扩容抖动)。-XX:+PrintGCDetails: 打印 GC 日志。-XX:+HeapDumpOnOutOfMemoryError: OOM 时自动 Dump 堆内存。
