
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了Java程序员在学习过程中需要掌握的一些垃圾回收机制基础知识等内容,而本文我们就继续来学习一下,垃圾回收算法常见类型都有哪些。
1、标记-清除算法
算法思想:该算法分为两个阶段,分别是标记和清除阶段,从每个GCRoots开始,依次标记有引用关系的对象,后将没有标记的对象清除。
该算法主要两点不足之处,一个是效率问题,无论是标记还是清除,他们的效率都不是很高;另一个是空间问题,这种算法会带来大量的空间碎片,如果程序在运行过程当中,产生了一个很大的对象,需要较大的连续空间来分配该对象时,往往会出现老年代还有很大内存空间剩余,但是却无法找到足够的连续内存空间,不得已去触发另一次垃圾收集动作(FGC)。
2、标记-整理算法
算法思想:标记过程跟标记-清除算法一样,然后将存活的对象集中整理到内存空间的一端,形成一片连续的已使用的区域,后再将该区域外的对象全部清除,这样就避免了连续碎片的问题。
3、复制算法(Mark-Copy)
算法思想:为了能够并行地标记和整理,将可用内存按容量划分成大小相等的两块,每次只激活其中一块。这样,当其中一块的内存用完了,垃圾回收时只需把存活的对象复制到另一块未被激活的空间上,后在清除掉除了未激活空间之外,其他占用内存空间的对象全部清除。
比如将Java堆内存空间分为较大的Eden和两块较小的Survivor,每次只使用Eden区和Survivor区其中的一块,当垃圾回收时,就将Eden和Survivor区中存活的对象复制到另一块未被使用的Survivor区,再清除掉Eden和用过的一块Survivor区空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%,只有10%的内存会被浪费。复制算法现在就作为YGC算法进行新生代的垃圾回收。
这样做的好处是每次只需要对整个空间一半的区域块进行内存回收,内存分配时也就不用考虑内存碎片、较少了内存空间的浪费等复杂情况,只要移动堆顶指针,按顺序分配内存即可。
4、分代收集算法
这种算法并没有新的思想,只是根据对象存活周期的不同将内存划分成几块。一般是Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就采用复制算法,只需要将存活的对象复制到未被使用的区域块,效率很高;老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清除或标记-整理算法进行回收。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。