2018-04-28 HotSpot中的回收算法实现

对象的产生流程:

new 一个对象,编译通过,从新生代eden(见复制算法)分配内存,没被回收进入Survivor,年龄+1,默认经过15次进入老年代,或者survivor中同年龄的对象超过一半,就将这一半及其以上年龄的对象加入老年代。如果新生代存活对象超过survivor容量,则通过担保直接进入老年代,老年代空间足够,否则进行Full回收(速度慢)

什么对象需要回收:不与gc root关联的对象
怎么查找:oopmap(通过hashcode检索)
什么时候执行:在安全点和安全区域执行
为什么在这些时间执行?
因为执行gc时所有线程要停止,在运行的线程发现gc开始进入安全点,在等待的线程进入安全区域,出安全区域时,先查看jvm是否在gc状态,不在gc状态时正常运行;否则继续等待
怎么回收对象:根据活动周期将对象分为新生代和老年代,用收集器回收

7种收集器

1Serial收集器 默认收集器(相对简单高效)

用户线程->安全点(暂停其它线程)->判断新生代->复制算法(gc单线程)->用户线程->安全点(暂停其它线程)->判断老年代->标记整理算法(gc单线程)->用户线程

2ParNew收集器 Serial收集器的多线程版本

用户线程->安全点(暂停其它线程)->判断新生代->复制算法(gc多线程)->用户线程->安全点(暂停其它线程)->判断老年代->标记整理算法(gc单线程)->用户线程

3Parallel Scavenge收集器

新生代收集器,基本和ParNew一样
适合后台运算不需要太多交互的任务
通过降低gc回收时间(牺牲吞吐量和新生代空间)提高效率,但是回收时间过短会导致回收次数增多
gc自适应调节:根据当前系统的运行状况,动态调整gc回收时间和最大吞吐量
吞吐量:程序运行时间/(程序运行时间+gc时间)

4Serial Old收集器 老年代收集器

作用:
1与Parallel Scavenge收集器搭配使用(jdk1.5及之前)
2Cms收集器的备选方案

5Parallel Old收集器

Parallel Scavenge收集器的老年代版本,在该收集器出现之前选择Parallel Scavenge收集器只能选择Serial Old收集器收集老年代so,性能很低。
1.5以后采用该收集器收集老年代,适合注重吞吐量及cpu资源的场合
新生代和老年代都采用多线程GC

6CMs 收集器

获取最短回收停顿的收集器,适合b/s系统,基于标记清除算法,共4个步骤:
初始标记,并发标记,重新标记,并发清除
耗时操作只有初始标记和重新标记。
缺点:
1并发占用线程,可能导致程序变慢,总吞吐量降低,当cpu是4核以上速度该缺点弱化
2无法处理浮动垃圾,由于清理是并发进行,所以清理是也会产生垃圾,所以需要预制一段内存来让存储信息,如果预制内存不够将会导致回收失败,同时启动预备的Serial Old收集器收集老年代,而这个耗时较久
3采用标记清除算法,产生内存碎片多,而当内存碎片多到无法分配对象时,会进行一次内存整理,耗时较久

7G1收集器

技术最前沿;面向服务端应用的垃圾收集器
特点:并行并发缩短停顿,分代收集:可独立管理整个GC堆,采用标记整理算法,可预测停顿时间,将整个堆划分成多个独立区域(Region),不隔离新生代和老年代;对Region分配垃圾堆积价值,值越大,越优先回收
过程:初始标记,并发标记,最终标记,筛选回收
与cms不同的是最终标记也是并发的

你可能感兴趣的:(2018-04-28 HotSpot中的回收算法实现)