CMS&G1

回收对象:

CMS 是针对老年代的垃圾回收器,常与年轻代垃圾回收期parNew配合使用,分代收集理论下的产品
G1 针对整个堆区的垃圾回收器,采用分区+分代收集。

GC类型:

CMS
Young GC 针对年轻代的GC
Full GC 针对整个堆区及方法区GC
并发失败 STW并由Serial Old代替CMS做GC

G1
Young GC 针对年轻代Region
Mixed GC 针对年轻代、老年代、大对象Region
Full GC STW并由单线程完成GC

算法理论:

CMS 标记-清除算法
G1 标记整理+复制算法

优缺点:

优点 缺点
CMS

1、并发收集,低停顿,面向小内存。

1、由于采用标记清除算法易产生空间碎片。

2、并发标记易产生浮动垃圾。

3、由于CMS默认启动的回收线程数是(处理器核心数量+3)/4。会导致对CPU资源敏感。

4、并发收集模式失败时会退化成单线程收集的serial Old收集器

G1

1、面向大内存,多cpu的机器。充分利用机器资源。

2、可预测STW时长。

3、低内存碎片

4、按收益动态回收

1、垃圾收集产生的内存占用及程序运行时的额外执行负载都要比 CMS 要高

核心参数:

CMS
启用CMS

-XX:+

UseConcMarkSweepGC

并发的GC线程数

-XX:

ConcGCThreads

解决cpu资源敏感问题
FullGC之后做压缩整理

-XX:+

UseCMSCompactAtFullCollection

解决空间碎片问题
多少次FullGC之后压缩一次

-XX:

CMSFullGCsBeforeCompaction

当老年代打到该比例会触发FullGC

-XX:

CMSInitiatingOccupancyFraction

解决因并发清理时用户线程产生新的对象导致老年代空间不足。引起的并发模式失败

只使用

-XX:

CMSInitiating

Occupancy

Fraction

设定的回收阈值,否则jvm只会在第一次使用该值,之后自动调整

-XX:

+UseCMSInitiatingOccupancyOnly

在重写标记之前先做YoungGC,减少老年代对年轻代的引用

-XX:

+CMSScavengeBeforeRemark

解决重新标记阶段时间过长
初始标记阶段使用多线程

-XX:

+CMSParallellnitialMarkEnabled

缩短STW
重新标记阶段使用多线程

-XX:

+CMSParallelRemarkEnabled

G1
启用G1

-XX:

+UseG1GC

指定GC线程的数量

-XX:

ParallelGCThreads

指定分区大小1-32M(2^n)。(默认2048个分区)

-XX:

G1HeapRegionSize

目标暂停时间(默认200ms)

-XX:

MaxGCPauseMillis

新生代内存初始空间(默认占堆5%)

-XX:

G1NewSizePercent

新生代内存最大空间

-XX:

G1MaxNewSizePercent

幸存者(Survivor)区的填充容量(默认50%)

-XX:

TargetSurvivorRatio

当幸存者区对象年龄超过1+...+n。则≥n的放入老年代
最大年龄阈值(默认15)

-XX:

MaxTenuringThreshold

老年代占整堆达到阈值(默认45%),触发Mixed GC

-XX:

InitiatingHeapOccupancyPercent

单个区中存活对象低于(默认85%)阈值,才会回收

-XX:

G1MixedGCLiveThresholdPercent

单次GC筛选回收次数(默认8)

-XX:

G1MixedGCCountTarget

空闲区域数量占堆比满足该阈值,则该Mixed GC停止(默认5%)

-XX:

G1HeapWastePercent

读写屏障:

读屏障
会把读出的指针更新到对象的新地址上,并且把堆里的这个指针“修正”到原本的字段里 ZGC

写屏障
增量更新 并发标记阶段,黑色对象指向新的白色对象时,导致该白色对象被当成垃圾,此时会把黑色对象对白色对象的引用记录下来,重新标记阶段会从该黑色对象重新扫描标记 CMS
原始快照SATB 并发标记阶段,灰色对象删除对白色对象的引用,导致该白色对象被当成垃圾,此时会把删前对该白色对象引用记录下来,重新标记阶段会从记录中灰色重新扫描白色对象。并将白色对象标为黑色对象在下一轮GC进行处理。 G1

你可能感兴趣的:(java,jvm)