前言:作为学习java虚拟机的基础,垃圾算法必须了解其实现原理。
1、标记-清除算法 ,最基础的算法,之所以说基础,所有的算法是在它基础上改进,它分为标记和清楚两个部分,首先标记,对所有的可回收对象标记一下,然后回收 。
两个步骤效率都很低。最大的缺点是。清除后产生很多不连续的碎片,如果一个大对象,进入内存,则不能被分配,造成再一次垃圾回收。
2、复制算法,为了避免这种不连续的碎片,采用了分区。分为三个区,edon, from survivor ,to survivor ,新生的对象一开始全被分配到edon 区 。from suivivor,存活的上次回收后还没达到能进入老年代的对象(有个计数器,一个对象默认被使用15 次进入老年代,当然大对象直接进入老年代),当内存满了,促发垃圾回收,这里的垃圾回收是minor GC,会把edon 区 和from survivor区 的存活的对象全部复制到了to survivor ,当然,回收之后,from suivivor 和to survivor名称就对换了。之所以这样做我个人认为survivor上有个计数器用于记录对象的使用次数。一般的默认edon和survivor比例是8:1.edon区加两个survivor区之和为新生代,这种算法保证每次新生代能使用的内存为虚拟机配置的百分之90%。当survivor空间不够时会通过内存担保机制直接进入老年代,并且,当垃圾回收的时候to survivor不够,即 没有达到15 次在新生代的对象和 from survivor 区存活的对象大于to survivor区最大内存,也会被分配到老年代。
3、标记-整理算法 , 把 所有的还在使用的对象标记和全放到一端,然后清除,保证不会出现内存不连续。
4、分代收集算法,这个算法是根据对象的存活周期把内存分为几块,一般是新生代,老年代。新生代对象存活率短,用复制算法。老年代用标记-清除,标记-整理算法