引用计数器算法算是一种古老的java垃圾回收算法,目前很多版本的java已经废弃掉这种算法了。不过多了解历史解决方案也是很有好处的,通过总结它的优缺点,再与新算法比较,可以帮助更好的理解新算法。

定义

给每个对象分配一个计算器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计算器为0时,java垃圾回收器会认为该对象是可回收的。
image.png

优点

  1. 实时回收内存:无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否为0,就可以直接回收。
  2. 应用无需挂起:在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不足,则立刻报OutOfMemory 错误。
  3. 区域性:更新对象的计数器时,只是影响到该对象,不会扫描全部对象


循环引用问题

image.png

  1. public class ReferenceCountProblem {
  2. static class A{
  3. private B b;
  4. }
  5. static class B{
  6. private A a;
  7. }
  8. public static void main(String[] args) {
  9. A a = new A(); //new A()的内存计数器为+1
  10. B b = new B(); //new B()的内存计数器为+1
  11. b.a = a; //new A()的内存计数器为+1
  12. a.b = b; //new B()的内存计数器为+1
  13. a = null; //new A()的内存计数器为-1
  14. b = null; //new B()的内存计数器为-1
  15. //最终算下来 new A()和new B()所的内存已经可以回收了,但是引用计数器还是1,所以这两块内存永远不能回收。
  16. }
  17. }