垃圾收集算法:
复制算法:一般用于年轻代。留着50%的空间进行复制,然后排序。
标记整理:在自己空间内标记有用对象然后重新排序。
标记删除:在自己空间标记无效对象进行删除,同时会使空间碎片化,并且效率不太高
垃圾收集器:
Serial:串行处理器,单线程,STW较快,好处就是简单
Parallel Scavengel: 并行处理器,优点是吞吐量大
ParNew:和ParallelScavengel 差不多,但是能和CMS共同使用。主要处理年轻代。
CMS:STW时间短,吞吐量小,用户体验高,大内存8G推荐使用,并发标记清除,分为几步,初始标记,并发标记,重新标记,并发清理,并发重置。但是也会有缺点:对cpu敏感和服务抢资源,会产生浮动垃圾,会有空间碎片生成,执行过程中可能会出现并发失败。
初始标记:STW,时间短,记录gc roots 直接引用的对象,
并发标记:公gc roots的直接关联对象开始查询整个引用图的过程,时间长,但是可以并发执行,不影响客户使用,同时可能在标记的过成功gcroots直接引用的状态可能会发生改变。
重新标记:STW,修复并发标记中状态改变的gcroots对象,主要使用三色标记更新算法。
并发清理:对未标记的区域进行清扫,这个阶段如果有新增的对象会被标记城黑色,不作处理。
并发重置:清理掉标记
G1:把堆内存平均分成许多个Region,最多2048个。优点:很少有内存碎片。
初始标记:STW,同CMS初始标记
并发标记:同CMS并发标记
最终标记:同CMS重新标记
筛选回收:回收算法主要是复制算法,有一个参数控制每次回收的STW时间,-XX:MaxGCPauseMillis,如果全部回收时间过多,那么只会回收部分Region。这里面有一个算法,按照更少时间回收更多的空间进行回收,就是回收效益比。
分为youngGC,MixedGC(EDEN,部分Old,大对象区域),FullGC(单线程,费时)
大内存,高并发 jdk8及其以后;
三色标记:
黑色: 所有成员变量都被扫描了
灰色:至少有一个成员变量没有被扫描
白色:成员变量没有被扫描
多标会变成浮动垃圾,下次执行gc时回收;
漏标:有两种方式,一个是增量更新,另一个是原始快照解决,增量存储是A->D 从A开始接着标记成灰色,重新读取,原始快照存储方式->D,D标记为黑色,变成浮动垃圾,下次gc时处理。使用写屏障实现。类似于AOP的概念。