什么是垃圾
在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。
失去引用关系的对象,称为垃圾对象。
垃圾回收算法
1. 引用计数法
根据“垃圾”的定义,直观的做法就是,为每个对象设置一个引用计数器。对对象进行扫描时,如果其引用为0则认为是垃圾,就可以准备回收了。
但是这样做的缺点在于,没有办法消除循环引用的垃圾对象,例如:
public class Main { public static void main(String[] args) { MyObject object1 = new MyObject(); MyObject object2 = new MyObject(); object1.object = object2; object2.object = object1; object1 = null; object2 = null; } } class MyObject{ public Object object = null; }
虽然指向object1和object2的引用都消除了,但是由于它们之间仍然互相地指向对方,引用计数不为0,所以不会被回收。为了解决这样的问题,有了第二种办法,可达性分析法。
2. 可达性分析法
该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
时间: 2024-10-06 17:37:29