2013-07-13 25 views
0

我有一个关于Java中的垃圾收集器执行的问题。垃圾收集器 - 不止一个指向同一个对象

说我这样做:

Person p1 = new Person(); 
Person p2 = p1; 

我能想象垃圾收集器是如何知道要解除人物对象时,P1为空,但我不明白他是怎么收集到的信息,现在有另一个指针到同一个名为P2的对象?

当我使用“new”运算符时,它是有道理的,因为它调用person和Object ctor来初始化该对象,并且它也可以保存ptr的地址,以便知道它何时引用null。 但它怎么能知道一个堆栈中分配指针(如“P2”)也指对象,因此它知道,当P1为空不应该释放它?

+0

为什么这是令人惊讶的? –

+0

你可能想看看在垃圾收集的维基百科页面:http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29 – derekerdmann

回答

3

由于垃圾收集器是该语言的一部分,因此可以跟踪程序的所有指针或在某个时刻枚举它们全部。它是由语言本身提供的:Java语言的设计方式使得可以创建一个Java虚拟机来跟踪所有现有的指针,并且可以可靠地将指针与其他数据区分开来。

1

上有垃圾收集器是如何工作的整个教材。而不同的工作方式不同。

但是,是的,垃圾回收器(从某种意义上说)知道所有指针都。

但是,也许你的困惑的根源是,你认为对象得到垃圾回收立即当没有什么引用他们。典型的垃圾收集器不适用。因此,这意味着,GC并不需要了解所有的指针所有的时间的。

事实上,GC通常只运行“偶尔”。而它的作用简单来说是通过所有的程序是指物体的地方追踪(直接或间接)找出哪些不是垃圾。其余的(GC没有跟踪的)是垃圾。

1 - 其实,这是一个显著过于简单。但是如果你想要完整的故事,你需要阅读更全面的资源......或者一本教科书。