垃圾收集器

◇◆丶佛笑我妖孽 提交于 2020-01-17 21:35:31

垃圾回收器分类:

回收示意图

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无法存放下来,就需要老年代进行空间分配担保;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!