垃圾收集器

目录

1.垃圾判断

1.1 引用计数法:

1.2 可达性分析:

1.3 常见的GC Roots有:

2.垃圾回收方式:垃圾收集器

2.1 CMS收集器:

2.2 G1收集器:


1.垃圾判断

1.1 引用计数法:

        对象有一个引用计数器,引用一次计数器就加1,计数器为0就是没有引用,但存在循环引用问题

1.2 可达性分析:

        以GC Roots为起点向下搜索,经过的路径叫做引用链,若对象和GC Roots之间没有任意一条引用链,则说明不可达,两次不可达则可以回收

1.3 常见的GC Roots有:

虚拟机栈中引用的对象;本地方法栈中引用的对象;被同步锁持有的对象;方法区中静态属性引用的对象

2.垃圾回收方式:垃圾收集器

Serial收集器:单线程,新生代,标记复制算法

ParallelNew 收集器:多线程,新生代,标记复制算法

ParallelScavenge收集器:多线程,新生代,标记复制算法;专注于吞吐量,CPU的高利用率

Serial Old收集器:单线程,老年代,标记整理算法

Parallel Old收集器:多线程,老年代,标记整理算法

CMS收集器:并发标记清除,专注于最短停顿时间,实现用户线程和垃圾收集线程并发工作

G1收集器(默认):在后台维护了一个优先列表,优先回收高优先级的区域

2.1 CMS收集器:

过程:四个步骤

  • 初始标记:标记GC Roots能直接关联到的对象,速度很快

  • 并发标记:从GC Roots的直接关联对象开始遍历所有对象,此时用户线程可以和垃圾收集线程并发运行

  • 重新标记:是为了修正并发标记期间因为用户程序运行而导致标记产生变动的对象的标记记录

  • 并发清除:对未标记的区域进行清除,此时能够与用户线程并发执行

优点:能够并发收集,减少用户等待时间

缺点:标记清除算法导致的空间碎片;对CPU资源敏感;无法处理浮动垃圾(并发清除阶段,用户线程运行也会产生新的垃圾对象,此时只能在下一次垃圾回收时处理)

2.2 G1收集器:

过程:四个步骤

  • 初始标记:标记GC Roots能直接关联到的对象,并修改TAMS指针的指

  • 并发标记:从GC Roots的开始对堆中对象进行可达性分析,递归扫描堆中的对象图,找出要回收的对象

  • 最终标记:暂停用户线程,用于处理并发阶段结束后遗留的少量SATB记录

  • 筛选回收:更新Region统计数据,对各个Region的回收价值和成本排序,根据用户期望的停顿时间制定回收计划,将回收的一部分区域的存活对象复制到一个空区域中,清理到整个旧区域全部空间;此时暂停用户线程,多条垃圾回收线程并行执行

优点:不会产生内存碎片;能够指定最大停顿时间;分区域的内存布局

缺点:占用额外的内存空间(每个Region维护一个优先列表)

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