您的位置:首页 > 其它

JVM垃圾回收算法

2016-08-26 21:10 148 查看
一、标记清除法
顾名思义,分为标记和清除两个步骤。
首先标记所有需要回收的对象,在标记后统一回收所有被标记的对象
如下图,缺点有两个:效率问题,标记和清楚的效率都不高     空间问题:标记清楚之后产生大量不连续的空间

二、复制算法
直接按内存的容量,将内存空间一分为二,每次都只用其中的一半,另一半保留。放一块内存用完之后,直接将还存活的对象复制到另一块内存上,再把原来的空间一次性全部清理。做保留区,之后就只分配另一半的内存
如下图:缺点十分明显,直接牺牲了一半的内存空间,优点也十分明显,一次性清理,没有内存碎片(现在商业虚拟机都采用这种算法来回收新生代)
IBM专门研究表明,新生代的对象98%是朝生夕死的。所以并不需要按照1:1的比例来划分,而是将内存分为一块较大的Eden和两块较小的Survivor空间,每次只使用其中的一块Survivor和Eden。每次回收的时候将已使用的Survivor和Eden存活的对象一次性拷贝到另一块Survivor上,最后清除Eden和刚刚用过的Survivor     HotSpot虚拟机默认Eden与Survivor之比是8:1,每次可以90%,仅仅只浪费了10%。当然,不可能保证每次年轻代都只剩10%以下的对象,所以还需要老年代来进行分配担保。

三、标记-整理算法

复制收集算法在存活率比较高的情况下,就要执行较多的复制操作,效率会变低。如果不想牺牲50的空间,还得要有额外的担保空间进行分配,以应对被使用对象100%存活的情况。所以老年代一般不采用这种算法,所以有人提出了标记整理算法。

四、分代收集算法
当前商量虚拟机都采用这种算法,当然,这种算法并没有什么新的思想,只是根据java对象存活周期的不同,划分了几块。一般是把java堆分为年轻代和老年代。
年轻代每次回收都有大批量的对象死去,所以采用复制算法
老年代由于没有多余的空间进行分配担保,而且对象存活率又比较高,所有一般采用标记整理算法,或者标记清除算法     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: