文章目录
1. 垃圾回收器关注点
- 关注角度
- 需要关注经典垃圾回收器
2. 经典垃圾回收器讲解
2.1 CMS收集器
参数设置
-XX:+UseConcMarkSweepGC
2.2 G1收集器
G1收集器的参数
-XX: +UseG1GC
- 设置默认停顿时间,一般设置在200-300ms左右,如果小于这个量级,就很容易出现FullGc从而影响性能。
设计细节
- 年轻代的GC
- 老年代的GC
- 此处的重点是采用了原始快照的方式
- 使用了写前屏障,进行记忆集和卡表的更新。
- 筛选回收,也就是独占清理需要STW
-
混合回收
2.3 ZGC
2.4 shenadoah
重要的点
- 并发整理,区别于G1的并行整理
- 不进行分代收集
- 连接矩阵,放弃了记忆集,不用维护,从而也没有伪共享。使用连接矩阵
3. 其他关注点
3.1 性能指标
- 吞吐量: 用户线程的时间/用户线程的时间 + GC的时间
- 延迟:就是垃圾回收停顿用户线程的时间
- 内存占用情况。
- 其他:回收频率等
其中延迟和吞吐量还有内存是矛盾三角。随着硬件的发展,吞吐量和内存可以解决,但是延迟却会随之升高。
3.2 参数设置
-
产看默认的垃圾回收器
- -XX:+PrintCommandLineFlags
- jinof -flag UseParNewGC 2343
- verbose:gc
-
各种收集器的使用设置
- -XX:+UseSerialGC
- -XX:+UseParNewGC // -XX:ParalleGCThreads 限制线程数目
- Parllel S和O是JDK8种默认的收集器
- -XX: +UseG1GC
-
不同收集器的参数设置,具体看各种收集器
-
一般的配置
- 老年代配置启动的阈值
- 多线程配置线程的数目
- 加上是否进行压缩,整理
3.3 日志分析
1. 关于日志的参数
2. Minor的回收日志
3. Full Gc的日志
总结来说,可以得到下面的信息
- 年轻代的回收情况
- 老年代的回收情况
- 元空间/永久代的回收情况
- 堆总体的回收请款
- 回收花费的时间信息
不同回收时间对比
-
user – GC运行时间
-
sys – 阻塞等待系统调用时间
-
real – 运行的真实时间
-
User + sys >= real
4. 垃圾回收器对比
4.1 G1于CMS的对比
- 工作流程对比
- 性能对比
- CMS适合4-6G内存,G1适合6G+内存
- CMS的最好性能和G1差不多,但是平均性能不如,最坏性能远远低于G1
- G1可以进行延迟预测,CMS不能
- 算法对比
CMS | G1 | |
---|---|---|
并发标记 | 增量跟新 | 原始快照 |
回收算法 | 标记-清除 | 标记复制 + 标记压缩 |
写屏障 | 写后屏障 | 写前屏障 |
- 并发于并行
- CMS只有在初始标记和重新标记阶段STW,所以延迟较小
- G1在初始标记,重新标记,并行回收阶段都STW,延迟较小,但是仍旧有延迟。