首页 > 编程语言 > 详细

标记-清除算法和复制算法

时间:2019-05-24 13:26:27      阅读:136      评论:0      收藏:0      [点我收藏+]

  最近笔者在学习JVM相关的知识,故写作此文来分享一下本人了解的一些垃圾回收算法。

  

  标记回收算法

 


  最基础的垃圾回收算法就是“标记-回收”算法(Mark-Sweep)算法,这是其它所有垃圾回收算法的基础,相当于内功,其它算法都是根据内功来发挥的外功。顾名思义,本算法需要先标记出所有需要回收的对象,待标记完成后,再统一回收所有被标记的对象。它的缺点很明显,首先是效率太低,标记和回收这两个过程的效率都不算太高;其次,因为需要回收的对象不一定是连续的(实际上往往都不是),因此会产生很多内存碎片,一旦需要分配一个较大的空间给某个新对象的时候,很可能就会因为没有足够的连续内存,从而再运行一次gc机制,其实也是影响程序的运行效率。

技术分享图片

  画一张图帮助理解一下对象占用内存的情况。

 

  复制算法


  CopyingGC算法是Marvin L.Minsky在1963年研究出来的算法,用来改进标记-回收算法。简单的说,就是把内存划分为两块(两块大小不一定要相等,事实上,也不建议相等,下面会详细说明),每次只使用其中的一块,当内存空间被占用完以后,就把尚在存活的对象存到另外的半区,再将当前半区已使用的内存空间一次清除掉。这样在分配内存时就不用考虑空间碎片,也不用使用空闲链表,避免了这类麻烦问题,只用移动堆顶指针,按顺序分配内存即可,有效提高了效率。

  现代的商业虚拟机大多数都是采用了复制算法,只不过不是狭义上的复制算法而已,而是采用了多空间复制算法,因为传统的复制算法会划出整个半区作为TO空间,这样做的成本未免太高了。IBM公司的研究表明,新生代内的大部分对象都是朝生夕死的,所以没有必要分配这么多内存空间去复制,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor空间,HotSpot虚拟机用的就是这种内存分配方式。当需要回收内存的时候,就把Eden和Survivor中还存活着的对象一次性地复制到另一块Survivor上,最后清理掉Eden和Survior,HotSpot默认的Eden和Survivor比例是8:1:1,就是说,每次能使用90%的内存容量。当然,也可能会出现剩余10%的Survivor空间不够复制原有存活对象的情况,那就需要依赖其它内存(这里指老年代)进行分配担保(Handle Promotion)。通过分配担保机制,这些对象会直接进入老年代。

 

标记-清除算法和复制算法

原文:https://www.cnblogs.com/CNty/p/10917531.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!