1.引用计数法:
给内存的对象弄上标记,被引用一次就加1,引用释放就减一,当为0时就可以被回收了。
弊端:无法检测出循环引用。解决方案:第二种方法
2.根可达性分析法:
从根开始搜索所有可达对象,剩下的就是可回收的
- java中可作为GC Root的对象有:
* 虚拟机栈中引用的对象(本地变量表)
* 本地方法栈中引用的对象
* 方法区中静态属性引用的对象
* 方法区中常量引用的对象
接下来就是根可达用哪些方法清除对象了:
标记-清除:把可达性分析后剩下的对象直接清除。 弊端:会导致内存不连续(内存碎片)
标记-整理:把可达性分析后确认仍被引用的对象向一端移动,清理掉边界以外的内存区域。解决了内存碎片化的问题
复制: 将还存活着的对象复制到另外一块内存区域上面,然后再把已使用的内存空间一次清理掉,这样就不会导致内存碎片的问题。 弊端:内存压力大,每次只能使用一半的内存
分代收集: 在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要少量存活对象的复制成本就可以完成收集。
而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或者“标记一整理”算法来进行回收
原文:https://www.cnblogs.com/jiex123/p/13051407.html