[java虚拟机]5.垃圾回收算法,垃圾回收器

引用博文:https://blog.csdn.net/yrwan95/article/details/82829186

垃圾回收算法

1.标记-清除算法

用法:
1.标记可回收的垃圾
2.清除需要被回收的垃圾
问题:
容易产生内存碎片,当内存碎片过多时,想要放入一个大的对象无法放入。
在这里插入图片描述

2.复制算法

复制算法其实就是解决了标记清除算法中内存碎片的问题。在YongGc的过程实际就是利用的copy算法。
使用:
YoungGc就是一个复制,清空,互换的过程。
再拿这张图进行分析
在这里插入图片描述
发生:
1.首先Eden区满后第一触发Gc,将活着的对象拷贝到from区
复制:
2.当eden区再次触发Gc时,此时就会扫描Eden+from区,对这两个区域进行垃圾回收,经过这次还存活过来的对象就拷贝到to区。同时对象的年龄加一,当年龄符合条件的对象就会被存储到old区。
清空,交换:
3.清空Eden和From区,From为空,TO不为空。
此时交换From与to , 那么此时变为From不为空,to为空
问题:
copy算法虽然没有内存碎片但是却对内存空间的使用早成了巨大的代价,因为可使用的内存缩小到原来的一般,而且如果对于存活率较高的话,copy算法就不太合适了。

3.标记-整理算法

为了解决内存空间的利用问题,我们又提出了标记-整理
用法:
1.标记出可回收的垃圾对象
2.将存货的对象都整理移向一端,清除一端之外的对象
在这里插入图片描述
问题:需要有个整理的过程,比较耗时,不适用与频繁发生的yongGc,适用与不频繁发生Gc老年代。

4.分代收集算法

也就是jvm目前所用的算法,这个算法其实就是在新生代使用copy算法,在老年代使用标记整理或标记清除算法。

5.引用计数法

用法:
1.对使用存活的对象+1,如果不引用的话就-1,当一个对象为0的时候,那么它不可能再被使用。

缺点:
无法解决java中对象相互引用的情况,当两个对象相互引用时,双方计数器会一直以为有对象再引用,计数器的值一直保持大于等于一,也就无法通知GC垃圾回收器回收它们!

垃圾回收器

1.Serial/Serial Old收集器

最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。

2.ParNew收集器

是Serial收集器的多线程版本,使用多个线程进行垃圾收集。

3.Parallel Scavenge收集器

是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。

4.Parallel Old收集器

是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。

5.CMS(Current Mark Sweep)收集器

是一种以获取最短回收停顿时间为目标的收集器(重视响应速度的一种收集器),它是一种并发收集器,采用的是Mark-Sweep算法。

6.G1收集器

是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值