我对Java中的垃圾收集器实现有疑问。
我说:
Person p1 = new Person();
Person p2 = p1;
我可以想象当p1引用null时垃圾收集器如何知道释放person对象但是我不知道他如何收集现在指向同一个名为P2的对象的指针的信息?
当我使用“new”运算符时,它有意义,因为它调用person和Object ctor来初始化该对象,并且它还可以保存ptr的地址,以便它可以知道它何时引用null。 但是怎么知道堆栈分配的指针(比如“p2”)也引用了那个对象,所以它知道当p1引用null时它不应该解除分配?
答案 0 :(得分:3)
由于垃圾收集器是语言的一部分,可以跟踪程序的所有指针或在某个时刻枚举所有指针。它由语言本身提供:Java语言的设计方式使得可以创建一个Java虚拟机来跟踪所有现有指针,并可以可靠地将指针与任何其他数据区分开来。
答案 1 :(得分:1)
有关于垃圾收集器如何工作的全部教科书。不同的工作方式不同。
但是,是的,垃圾收集器(在某种意义上)确实知道所有指针的位置。
然而,您可能会感到困惑的原因是,当没有任何内容引用时,您认为对象会立即收集 。对于典型的垃圾收集器而言,情况并非如此。这意味着GC不需要一直知道所有指针 。
事实上,GC通常只会“偶尔”运行一次。它用简单的术语 1 来做的是跟踪程序引用对象(直接或间接)的所有位置,以找出哪些不是垃圾。其余的(GC没跟踪的那些)是垃圾。
1 - 实际上,这是一个显着的过度简化。但如果你想要完整的故事,你需要阅读更全面的资源......或教科书。