垃圾收集弄清3个问题
1、哪些内存需要回收 2、何时回收 3、怎么回收(垃圾收集算法)
垃圾收集概念:
有效自动监测对象是否超过作用域而达到自动回收内存的目的。
引用计数算法:给对象加一个引用计数器,用到的时候+1,引用失效的时候-1,当计数器为0时对象可能不再被使用
优点:实现简单,效率高
缺点:如两个对象互相引用,A.instance = B, B.instance = A 这两个对象都不再有用,但是计数器不为0,不能回收
可达性分析算法:GC Roots作为对象起始点,向下搜索,走过的路径称为引用链,当一个对象没有任何引用链相连,则对象不可用,可以回收。
垃圾收集算法:
1、标记-清除算法
首先标记所有需要回收对象,在完成标记后统一回收
缺点:1、效率不高,标记和清除过程效率低
2、标记清除后产生大量不连续的内存碎片,导致需要给较大对象分配内存时找不到空间,又开始下一次gc
2、复制算法
将内存分为大小相等两块,每次只用一块,当一块用完时,将存活的对象复制到另一块上,将用过的那块内存空间一次性清理
优点:每次对整个半区进行回收,不产生碎片,简单高效
缺点:内存缩小为原来的一半,这样缩小一半的代价很高
3、标记-整理算法
与标记-清除算法相似,但标记后不是马上清除,而是所有存活的对象像一端移动,然后清除掉边界以外的内存