1、标记-清除法

      标记清除法分为标记和清除两个阶段,首先jvm会对需要进行回收的内存进行标记,标记完成之后在对标记的内存进行清理。这种算法是垃圾回收中最基本的算法,

     后续很多算法都是基于它而进行不同的改造。

     标记清除法主要有两个问题:

     ①效率问题,标记和清理两个过程的效率都不是很高

     ②空间问题,标记清除法回收后内存空间会有很多内存空间碎片,导致有时候需要一块较大的内存时,而内存中没有一块足够大的内存可供使用,可能导致第二次GC

2、复制算法

     复制算法其实就是将内存一分为二(具体看虚拟机的实现),每次只用其中的一部分,等到需要清理的时候,将存活的对象复制到另外一块内存上,已使用的内存区域

     直接清理,这样就可以避免内存中过多的空间碎片,但是会牺牲一部分内存空间为代价,同时如果对象的存活率比较高,复制算法的效率就不会很高。

3、标记整理法

     标记整理法和标记清除法类似,只是在清除的过程不一样,标记整理算法首先也是对需要进行回收的内存进行标记,标记完成之后会让存活的对象内存向一端移动,直接

     清理掉端边界意外的内存,对应存活率比较高的老年代比较适用

4、分代算法

     分代算法其实不是什么新的算法,只是根据当前堆内对象的存活周期不同划分成几块,一般会划分成新生代和老年代。新生代对象的存活率低,适用复制算法,这样只需要复制

     少量的存活对象,就能完成内存的清理,而老年代,存活对象较多,可使用标记清理、标记整理进行内存的回收。