0

我对 Java 中的垃圾收集器实现有疑问。

说我同意:

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

我可以想象当 p1 引用 null 时垃圾收集器如何知道释放人员对象,但我不明白他如何收集现在有另一个指向名为 P2 的同一对象的指针的信息?

当我使用“new”运算符时,这是有道理的,因为它调用人和对象ctor来初始化该对象,并且它还可以保存ptr的地址,以便它可以知道它何时引用null。但是它怎么知道堆栈分配的指针(如“p2”)也引用了该对象,所以它知道当 p1 引用 null 时它不应该释放它?

4

2 回答 2

3

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

于 2013-07-13T06:39:11.083 回答
1

有关于垃圾收集器如何工作的完整教科书。不同的以不同的方式工作。

但是,是的,垃圾收集器确实(在某种意义上)知道所有指针的位置。

但是,也许您感到困惑的根源在于,您认为对象在没有任何东西引用它们时会立即被垃圾收集。对于典型的垃圾收集器来说,情况并非如此。所以这意味着 GC 不需要一直知道所有的指针

事实上,GC 通常只“偶尔”运行一次。简单来说,它所做的1是跟踪程序(直接或间接)引用对象的所有位置,以找出哪些不是垃圾。其余的(GC 没有跟踪的)是垃圾。

1 - 实际上,这是一个明显的过度简化。但是,如果您想要完整的故事,则需要阅读更全面的资源……或教科书。

于 2013-07-13T07:47:29.627 回答