1.引用计数法
记录每一个对象的引用次数,如果一个对象被其他变量所引用,那么这个变量的计数+1,如果这个对象被引用两次则计数为2。如果某一个变量不再引用它,那么计数就减一。如果减为0,那么就执行垃圾回收。但是这种情况有个问题,如果A引用B,B也引用A,存在循环引用,但是这两个对象没有人引用他们,但他们计数为1,这种情况下无法进行垃圾回收。
2.可达性分析法(针对上述问题,提出的解决方案)
可达性分析算法是判断哪些对象是根对象的算法,在垃圾回收之前对堆内所有对象进行扫描,首先要确定根对象,哪些可以作为根对象?
1.System Class 系统类(启动类加载器加载的类)
2.Native Stack 操作系统方法在使用时引用的java对象
3.Thread 活动线程中引用的一些对象(活动线程执行过程中,局部变量所引用的对象作为根对象)
4.Busy monitor 被加锁的对象Synchronize