垃圾回收算法
java虚拟机在进行内存回收时会在对象所处的时期不同而采用不同的垃圾回收算法,这里记录一下几种算法的实现与思想。
标记-清除算法
这是一个基本的算法,这个算法出现之后的算法都是由他改良而来。标志-清除算法有两个阶段,分别是标志和清除。
首先标志出所有需要回收的对象,在标志完成后统一回收所有被标志的对象。
但是这个算法有两个问题。第一,标志-清除两个过程效率不高;第二,标志清除之后会产生大量不连续的碎片,如果存在一个大对象需要分配空间时,可能会没有足够大的空间予以分配。
复制算法
将可用内存按容量分为大小相等的两块,每次使用其中的一块。当这一块内存用完了,就将还存活着的对象复制到另外一块去。然后把已使用过的空间一次清零,这就避免了内存碎片的问题。这个算法的优点是运行高效,实现简单;但是缺点也很明显,将内存缩减为了原来的一半。
在虚拟机对复制算法的使用中,并不是把容量分成大小相等的两块,而是按照8:1的比例划分为两个空间,Eden和Survivor空间。Survivor空间有两个,每次使用Eden空间和一块Survivor。但回收时,一次性将Eden和Survivor中还活着的对象一次性复制到另一个Survivor上面,然后在清理掉Eden空间和刚才使用的Survivor空间。
该算法在对象存活率较高的时候需要进行很多的对象复制操作,效率将会变低。
标志-整理算法
标志过程与标记-清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象向一端移动,然后清理掉端边界以外的内存。该算法应对与对象存活率较高的情况。
分代收集算法
当前商业虚拟机都是用分代收集算法来进行内存回收。该算法根据对象存活的周期将内存划分为几块,一般是把java堆分为新生代和老年代。在新生代中,被创建的对象大多数“朝生夕死”,存活率不高,所以这个区域使用复制算法;而老年代中对象存活率高,没有额外空间,所以必须使用标志-整理算法或者标志-清除算法

浙公网安备 33010602011771号