垃圾回收算法一共分为四种
标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法
标记清除算法是最开始就被使用到的算法,也是最简单到算法,其实就是通过算法,先标记内存中哪些东西属于垃圾(即没用的对象),然后等垃圾收集到一定到数量后,再进行回收,这种算法是最基础的算法,其他算法也基于这种算法进行优化的。这种算法有什么缺陷呢,因为一个内存中,各个垃圾对象的分布是不均匀的,按照这种算法进行回收之后,会形成大量的内存碎片,清理一次之后,会腾出很多稀稀拉拉的内存空间,万一要申请一个比较大的连续空间就会显的很无力,所以有些时候为了给其他对象预留空间,可能还没有收集到指定大小的垃圾数量就要进行回收了。复制算法
复制算法很简单,将内存划分为均等的AB两个空间,一次只使用一个空间(假设这里使用了A空间),当这块用完了之后,就进行垃圾清理,将所有的还在使用到的对象复制到另一个空余的内存空间B中。当然,这时候的复制肯定是顺序复制,不会复制的稀稀拉拉的,然后将A空间一次性全部清理干净,然后继续使用B空间,B满了之后,有用的对象就复制到A空间,一次性清理完B空间,如此反复循环。
虽然效率提高了,但这代价有点高啊,一半的内存都被浪费了,但是我们知道很多对象都是“朝生夕死”,所以并不会愚蠢的“浪费”一半的空间,已经层层思考探索,现在已经将“浪费”的空间减少到10%了。这里到10%要怎么理解,就是垃圾回收清理了一次之后,还剩下10%的有用对象,不过有用对象超过10%怎么办,所以这个时候需要有块内存区域要做担保,万一超过10%就启用这块担保内存。标记-整理算法
复制算法会存在“浪费”内存的现象对不对,标记整理算法为其进行优化,将垃圾标记起来,所有的有用对象都重新依次排列,按内存空间的顺序排列,如果当前的内存位置有垃圾对象,就直接覆盖,按照排列顺序,将最后一个有用对象后面所有的区域都清理干净。分代收集算法
分代收集算法其实是再做标记,将那些经历过垃圾回收之后还保留下来的对象称为老年代。在老年代的对象意味着会被长期使用,将这些放在一个指定的位置,就可以使用标记-清除算法或者标记整理-算法。那些新的对象,就放在新生代的内存区域中,使用复制算法。