垃圾回收算法

1、标记-清除算法

1、标记—清除算法定义

​ 标记—清除算法是最基础(其它的收集算法大多以标记—清除算法为基础)的垃圾收集算法。算法分为标记和清除两部分。

​ 标记:标记出所有需要回收的对象/或标记存活的对象。

​ 清除:在标记完之后,统一回收掉所有被标记的对象/或统一回收所有未被标记的对象。

​ 标记过程:对象是否属于垃圾的判定过程(垃圾对象标记判定算法)。

2、标记—清除算法缺点

​ 执行效率不稳定;内存空间碎片化问题;

​ 1)执行效率不稳定:如果Java堆中包含大量对 象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过 程的执行效率都****随对象数量增长而降低

​ 2)内存空间碎片化问题:标记、清除之后会产生大 量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

3、标记—清除算法的执行过程图

在这里插入图片描述

2、标记-复制算法

1、标记—复制算法(现在被java虚拟机多在新生代中优先采用)的定义?

​ 标记—复制算法(复制算法)。

​ 它将可用 内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

2、标记—复制算法的优缺点

​ 优点:简单高效;没有碎片;现在商用JAVA虚拟机多在新生代中采用该方法。

​ 缺点:内存空间的浪费;如果空间内大量对象都是存活的,复制的开销增大。

​ 如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销,但对于多数对象都是可回收的情况,算法需要复 制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。这样实现简单,运行高效。

3、标记—复制算法的示意图

在这里插入图片描述

4、更优化的半区策略(Appel式回收)定义

​ 1)Appel式回收的具体做法是把新生代分为一块较大的Eden空间和两块较小的 Survivor空间,每次分配内存只使用Eden和其中一块Survivor。

​ 2)发生垃圾搜集时,将Eden和Survivor中仍 然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,也即每次新生代中可用内存空间为整个新 生代容量的90%(Eden的80%加上一个Survivor的10%),只有一个Survivor空间,即10%的新生代是会 被“浪费”的。

5、更优化半区策略比半区策略优化在什么地方

​ 优化前内存空间浪费50%——优化后内存空间浪费10%。

​ 优化前有碎片化问题——优化后没有碎片化问题。

6、更优化的半区策略的示意图

在这里插入图片描述

7、JVM新生代(更优化的半区策略)为什么需要2个Survivor区

​ 1)刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;

​ 2)等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。

​ 3)S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。如果对象的复制次数达到16次,该对象就会被送到老年代中。下图中每部分的意义和上一张图一样,就不加注释了。

在这里插入图片描述

3、标志-整理算法

1、标记—整理算法(回收老年代使用此方法)的定义

​ 标记:标记出所有需要回收的对象/或标记存活的对象。

​ 整理:让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

2、标记—清除算法与标记—整理算法的区别

​ 标记-清除算法是一种非移动式的回收算法;标记—整理算法是移动 式的。

3、标记—整理算法的优缺点

​ 缺点:如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新

所有引用这些对象的地方将会是一种极为负重的操作;而且这种对象移动操作必须全程暂停用户应用程序才能进行。像这样的停顿被最初的虚拟机 设计者形象地描述为“Stop The World”(Stop The World非常影响系统的响应时间)。

4、标记—整理算法的示意图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值