堆回顾:
eden 新生代,新创建的对象
s0,s1 survior存活区,大小完全一样,也可叫from to,是复制算法的体现。
tenured 老年代,一般大对象会存放于此,及多次GC依然被不需要被回收的对象
串行收集器 -XX:+UseSerialGC
最古老,最稳定,效率高,可能会产生较长的停顿。
- 新生代、老年代使用串行回收,只使用一个线程进行回收
- 新生代复制算法
- 老年代标记-压缩
并行收集器
1. -XX:+UseParNewGC
- 新生代并行,老年代串行(对新生代的并行 Parallel New ...)
- Serial收集器新生代的并行版本
- 新生代复制算法
- 多线程,需要多核支持(多线程不一定就快,在多核CPU下可能会快,需要设置合理的多线程数量。如果是单CPU还是建议使用串行收集器)
- -XX:ParallelGCThreads 限制线程数量
2. -XX:+UseParallelGC 和 -XX:+UseParallelOldGC
- 类似parNew, Parallel收集器,串行收集器在新生代和老年代的并行化
- 新生代复制算法
- 老年代标记-压缩
- 更加关注吞吐量
- -XX:+UseParallelGC 使用Parallel收集器 + 新生代并行 老年代串行
- -XX:+UseParallelOldGC 使用Parallel收集器 + 新生代并行 老年代并行
3. -XX:MaxGCPauseMils
- 最大停顿时间,单位毫秒
- GC尽力保证回收时间不超过设定值
4. -XX:GCTimeRatio
- 吞吐量。单位时间内分到的CPU大小,分到的越多吞吐量越大。
- 取值范围0-100
- 垃圾收集时间占用CPU总时间的比
- 默认99,即最大允许1%时间做GC
- 3和4是矛盾的。因为停顿时间和吞吐量不能同时调优。
CMS收集器(Concurrent Mark Sweep)
- 标记清除算法
- 与标记压缩相比,并发阶段会降低吞吐量
- 注意与并行的区别。并发,与用户线程一起执行
- 老年代收集器(不会再新生代使用)
- -XX:+UseConcMarkSweepGC
[Full GC (System.gc()) [CMS: 0K->574K(87424K), 0.1261408 secs] 2795K->574K(126720K), [Metaspace: 2832K->2832K(1056768K)], 0.1486797 secs] [Times: user=0.00 sys=0.01, real=0.15 secs]
- 过程:
- 初始标记,根可以直接关联到的对象,速度快,会产生停顿
- 并发标记,和用户线程一起,主要标记过程,扫描标记全部对象
- 重新标记,由于并发标记时用户线程依然运行,因此在正式清理之前会做一遍修正,会产生停顿
- 并发清除,和用户线程一起,基于标记结果直接清理对象。
- 特点
- 尽可能降低停顿
- 会影响系统整体吞吐量和性能
- 清理不彻底(清理阶段,用户线程会产生新的垃圾,无法清理)
- 因为和用户线程一起运行,不能在空间快满时再清理
- -XX:CMSInitiatingOccupancyFraction设置触发GC的阈值,老年代空间被使用多少后出发。
- 如果内存空间预留不足,就会引起concurrent mode failure,出现这种情况会使用串行收集器作为后备
- XX:+UseCMSCompactAtFullCollection Full GC后进行一次碎片整理,整理过程是独占的,会引起停顿时间变长
- XX:+CMSFullGCsBeforeCompaction 设置几次Full GC后进行一次碎片整理
- -XX:ParallelCMSThreads 设置CMS线程数量
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
思考:为了减轻GC压力
- 软件如何架构
- 代码怎么编写
- 堆空间如何分配
性能的根本在应用、GC参数属于微调、设置不合理会影响性能,产生大的延时、、