采用引用计数法和可达性分析两种方法来判断一个对象是否应该被回收
引用计数法:
可以通过引用计数法来判断一个对象是否可以被回收。在为对象添加一个引用时,引用计数加1;在为对象删除一个引用时,引进计数减1;如果一个对象的引用计数为0,则表示此刻该对象没有被引用,可以被回收。
引用计数法可能存在循环引用的问题,所以一般不用引用计数法,而是用可达性分析法
可达性分析法:
首先定义一些GC Roots对象,然后以这些GC Roots对象作为起点向下搜索,如果在GC roots和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象要经过至少两次标记才能判定其是否可以被回收,如果在两次标记后该对象仍然是不可达的,则将被垃圾收集器回收。
如下图,橙色的表示和GC Root 之间没有可达路径的对象(需要回收的对象),白色的表示和GC Root之间有可达路径的对象
哪些对象可以作为GC ROOT呢?
主要有以下几种:
1. 虚拟机栈引用的对象
2. 处于存活状态的线程对象
3. 方法区静态引用的对象
4. 本地native方法jni引用的对象