1. JVM垃圾收集器核心机制解析
在Java虚拟机内存管理中,垃圾收集器(Garbage Collector)承担着自动内存回收的重任。不同于C/C++等需要手动管理内存的语言,Java开发者虽然无需直接操作内存释放,但理解GC工作机制对性能调优至关重要。现代JVM主要采用分代收集策略,将堆内存划分为新生代(Young Generation)和老年代(Old Generation),针对不同区域的生命周期特性采用差异化回收算法。
1.1 分代收集理论实践
HotSpot虚拟机将堆内存划分为三个物理区域:
- 新生代(Eden + Survivor0 + Survivor1):存放新创建的对象,占总堆1/3空间
- 老年代(Tenured):存放长期存活对象,占2/3堆空间
- 元空间(Metaspace):JDK8后取代永久代,存储类元信息
对象晋升流程遵循"年龄计数器"机制:
- 对象首次分配在Eden区
- Minor GC时存活对象移至Survivor区并年龄+1
- 默认达到15次(-XX:MaxTenuringThreshold可调)仍存活则晋升老年代
- 大对象(-XX:PretenureSizeThreshold定义)直接进入老年代
1.2 主流收集器实现对比
| 收集器 | 适用区域 | 算法 | 线程模式 | 适用场景 | 关键参数 |
|---|---|---|---|---|---|
| Serial | 新生代 | 标记-复制 | 单线程 | 客户端模式 | -XX:+UseSerialGC |
| ParNew | 新生代 | 标记-复制 | 多线程 | CMS配合 | -XX:+UseParNewGC |
| Parallel Scavenge | 新生代 | 标记-复制 | 多线程 | 吞吐优先 | -XX:+UseParallelGC |
| Serial Old | 老年代 | 标记-整理 | 单线程 | 客户端模式 | -XX:+UseSerialGC |
| Parallel Old | 老年代 | 标记-整理 | 多线程 | 吞吐优先 | -XX:+UseParallelOldGC |
| CMS | 老年代 |
