浅谈垃圾收集机制与垃圾收集器(二)

时间记录:2020-05-05
了解了垃圾收集的一些机制和方法了,但是回收最大的问题就是如何保证原有的线程的运行,也就是stop the world,垃圾收集算法在不同的虚拟机上的实现还是有点区别的,由于平台的不同,而垃圾回收都是内存上的操作,所以实现上不同。
垃圾回收最主要的就是对内存的操作,当对应的内存区域内的内存不存在连续的内存块供使用的时候就会进行垃圾回收了,主要的就是将没有用的内存回收以及将内存碎片整理。

标记-清除算法
首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。而标记过程就是可达性分析中说到的,如果不可达就代表这其要被回收也就是标记了,此回收的方法是最基础的回收算法,以后的算法都是在此的基础上面进行改造的,但是这个算法存在不足的地方。
我们知道对象在内存之中的位置是不确定的,也就是对象在内存中的位置是穿插的,也就是说要被回收的对象的内存位置就不知道在哪里的,然后进行回收后就会造成穿插的情况,也就会造成内存碎片,然后如果需要大的内存块的时候,发现内存区域没有这样的存在就会在再次进行垃圾收集操作。
其次这种标记的方式效率不是很高,由于需要停止其他的线程的操作,就会造成效率问题,会存在一定的停顿时间,对用户来谁很不友好。
在这里插入图片描述
可以很明显看到回收后出现了很多不连续的内存块,如果下一次找不到对应的大小的内容就会导致再次回收,由此衍生出了复制算法。

复制算法
将内存按容量划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了,就将还存活着的对象复制到另一块上面,然后再把已经使用过的内存空间一次清理掉。这样就不用考虑内存碎片的问题了,只要一动堆订指针按顺序分配内存就可以了,简单实现运行高效,但是这种情况就会将原来能使用的内存缩小一半了,这样的代价有点的大。
这种机制在新生代中使用的,由于新生代对象大部分生命周期都特别短,所以不用按照对半的方式分配对象,只需要很小的一部分供新生代保存就可以了。所以将内存分成一块较大的Eden和两块较小的Survivor空间,每次使用Eden和一块Survivor空间,回收时将Eden和Survivor中还存活的对象一次性复制到另一块Survivor中,最后清理刚才使用过的Eden和Survivor空间。当然如果复制过去的时候发现大小不够的时候就会迁移到老年代中,就会由老年代进行分担着块的压力。

在这里插入图片描述
以上由于内存区域的只能使用一般,就会导致浪费,由此衍生出了标记整理的算法,就是在回收后将内存碎片进行整理,这样未使用的部分就会连续的了。

标记-整理算法
标记算法 过程仍和标记清除算法一样,但是后续步骤不是直接对可回收内存对象进行清理,而是让所有存活的对象都移向一端,然后直接清理边界以外的内存。就是讲内存进行覆盖,然后将原来的的清理掉。
在这里插入图片描述
由于虚拟机中不同的区域的内存存在不同的特点,所以根据这些特点使用与不同的回收算法,所以存在分代回收。

分代收集算法
在新生代中,每次垃圾收集时都会发现有大量对象死去,只有少量存活,所以使用复制算法,只需要付出受凉存活对象的复制成本就可以完成收集,而老年代中因为对象存活率高,没有额外的空间对它进行分配担保,所以使用标记清理或者标记整理算法来进行回收。
由此我们可以知道对象先在新生代中进行,然后再去到老年代中进行,我们就会清楚对象的内存不能很大,如果很大就会导致新生代和老年代中频繁的复制的情况,当然这个事提供参数进行配置,当一次的对象超出一定大小的时候就会直接到老年代中进行分配内存,就避免了复制的情况。后续总结与此相关的内容。
时间记录:2020-05-05

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值