JVM垃圾回收机制
GC算法详解
flowchart TD
GC算法[GC算法]
GC算法 --> 标记_清除[标记-清除]
GC算法 --> 标记_整理[标记-整理]
GC算法 --> 复制算法
GC算法 --> 分代收集
垃圾收集器对比
收集器 |
算法 |
适用区域 |
特点 |
Serial |
复制 |
新生代 |
单线程,STW |
ParNew |
复制 |
新生代 |
多线程版Serial |
Parallel Scavenge |
复制 |
新生代 |
吞吐量优先 |
Serial Old |
标记-整理 |
老年代 |
Serial老年代版 |
Parallel Old |
标记-整理 |
老年代 |
Parallel Scavenge老年代版 |
CMS |
标记-清除 |
老年代 |
低延迟,并发收集 |
G1 |
分代+分区 |
全堆 |
可预测停顿 |
GC日志分析
# 典型GC日志
[GC (Allocation Failure) [PSYoungGen: 65536K->10752K(76288K)] 65536K->15488K(251392K), 0.0118329 secs]
# 关键字段说明:
- PSYoungGen:Parallel Scavenge收集器新生代
- 65536K->10752K:回收前->回收后大小
- (76288K):新生代总容量
- 65536K->15488K:堆回收前后大小
- (251392K):堆总容量
- 0.0118329 secs:耗时
调优案例
# 电商系统配置示例
-Xms4g -Xmx4g
-XX:NewRatio=1
-XX:SurvivorRatio=8
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
最佳实践
- 小内存应用(4G内):CMS
- 大内存应用(8G+):G1
- 吞吐优先:Parallel Scavenge+Parallel Old
- 避免频繁Full GC
- 合理设置新生代比例