1,标记-清除算法,分为标记和清除两个阶段,清除是指直接清除GC Roots不可达的对象,这种算法一是效率不高(标记和清除的效率都不高),二是会产生大量的内存碎片,在老年代中使用。
2,复制算法,该算法将内存分成大小相等的两块,每次都使用其中的一块,当这块内存用完,就将该区域还活着的对象复制到另一块中,然后将该区域全部清除,复制过去的对象占据的内存空间是连续的,但是这种算法使得原本的内存空间缩小一半,代价太高。现代商业虚拟机都是采用该种算法对新生代进行回收,但是内存的划分不是按照1:1进行划分,二是将内存划分为Eden和两块Survivor,大小为8:1,每次都保留一块survivor空间不使用,而由于新生代中的对象存活率较低(低于98%),所以正常情况下是可以保证预留的survivor可以放得下复制过来的存活对象。但是这种方式存在不确定性,这时就需要内存分配担保机制,需要注意的是,这些对象经过分配担保机制进入的是老年代。
3,标记-整理算法,该算法是对标记-清除算法的改进,将存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
需要说明的是当代商业虚拟机都是采用分代收集算法,根据对象存活周期的不同,将内存分为新生代和老年代,根据各个年代的特点采用不同的算法。一般在新生代中采用复制算法,在老年代中采用标记-清除或者标记整理算法。