垃圾收集的根源是什么?
我把root的定义理解为"程序可以访问的任何引用",live的定义是正在使用的对象,可以是局部变量,也可以是静态变量.
区分根对象和活对象之间的区别让我有点困惑.
什么是通往根的道路?根对象和活动对象是如何工作的?
有人能详细说明一下吗?
垃圾收集的根源是什么?
我把root的定义理解为"程序可以访问的任何引用",live的定义是正在使用的对象,可以是局部变量,也可以是静态变量.
区分根对象和活对象之间的区别让我有点困惑.
什么是通往根的道路?根对象和活动对象是如何工作的?
有人能详细说明一下吗?
如果把内存中的对象看作一棵树,"根"就是根 node ——程序可以立即访问的每个对象.
Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();
有四个对象;一个人,一辆红色的汽车,它的引擎和喇叭.绘制参考图:
Person [p]
|
Car (red)
/ \
Engine AnnoyingHorn
最后你会在树的"根"处得到Person
.它是活动的,因为它被一个局部变量p
引用,程序可以随时使用它来引用Person
对象.这也适用于其他对象,通过p.car
、p.car.engine
等.
由于Person
和所有其他递归连接到它的对象都是活动的,如果GC收集它们将会有麻烦.
但是,如果在一段时间后运行以下命令,请考虑一下:
p.car = new Car(BLUE);
然后重新绘制图表:
Person [p]
|
Car (blue) Car (red)
/ \
Engine AnnoyingHorn
现在,Person
可以通过p
访问,蓝色汽车可以通过p.car
访问,但红色汽车或其部件再也不能访问了-它们没有连接到活动的根.它们可以安全地收集起来.
因此,这实际上是一个从每个起点(每个局部变量、全局变量、静态变量、其他线程和堆栈框架中的所有内容)到每个根的问题,并递归地跟踪所有引用,以形成所有"活动"对象的列表:正在使用且不适合删除的对象.其他一切都是垃圾,等待收集.