垃圾回收器分类:
回收示意图
serial/serial old回收器搭配使用
paraNew和 serial Old搭配
标记 整理
parallel scavenge: 可控的吞吐量
停顿时间越短适合与用户交互的程序,响应速度能够提升用户的体验,吞吐量能够能高效率的利用cpu的时间。
在Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;
cms垃圾收集器
特点:
1 采用标记-清除 没有压缩算法 产生垃圾碎片 (设置参数多次不压缩的GC后来一次压缩的)
2 产生浮动垃圾(Concurrent Mode Fail): 由于并发标记过程中用户线程运行产生的垃圾,所以CMS回收器会在OLD区域未填满时就进行垃圾回收 ,有一个 百分比 -XX:CMSInitiatingOccupancyFraction来设置这个比例。 如果产生的浮动垃圾太多了,预留的内存无法满足,就会临时使用SerialOld收集器,就是说这个比例设置的太大了的话,就可能会导致serial oLD回收,停顿时间变大。
G1垃圾回收器
官方文档: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#garbage_first_garbage_collection
G1将堆划分为固定大小的区域(灰色框),如图9-1“按G1进行堆划分”。
G1是世代相传的。一组空区域被指定为逻辑年轻代。在图中,年轻一代是浅蓝色的。分配工作是从逻辑上年轻的一代中进行的,当年轻一代已满时,该区域集将被垃圾收集(一个年轻的集合)。在某些情况下,可以同时收集一组年轻区域之外的区域(深蓝色的旧区域)。这称为混合集合。在图中,正在收集的区域用红色框标记。该图说明了混合的收集,因为同时收集了年轻区域和旧区域。垃圾收集是一个压缩收集,它将活动对象复制到选定的最初为空的区域。根据幸存对象的年龄,可以将对象复制到幸存者区域(标有“ S”)或复制到旧区域(未具体显示)
特点:
1基于 标记整理算法,不会产生内存碎片。
2 非常精确的控制停顿时间,将内存拆分成多个region,根据每个region垃圾堆积的程度,在后台维护一个优先列表,每次根据允许的时间优先回收垃圾最多的区域
3
Allocation (Evacuation) Failure: g1也会产生浮动垃圾,并且如果剩余空间不能满足浮动垃圾呢,就会产生一次FULL GC;
垃圾回收相关参数
3
对象什么时候进入老年代
大对象直接进入老年代
大对象需要占用连续的空间
避免大对象在surivivor和from to 之间来回复制;
长期存活进入老年代
-XX: MaxTenuringThreshold 设置大于等于改年龄就会到老年代;(每次mirrorgc对象年龄+1)
动态年龄判断
如果survivor空间中所有相同年龄的的所有的对象大小综合大于survivor空间的一般,年龄大于等于改年龄的对象直接进入老年代
防止很多对象没有到设置的年龄,但是survivor空间却沾满了,但是对象还不回收;
空间分配担保
如果一次mirrorgc过后所有的对象都存货的话,surviror无法存放下来,就需要老年代进行空间分配担保;
来源:CSDN
作者:guitancheng5454
链接:https://blog.csdn.net/guitancheng5454/article/details/104021025