【发布时间】:2014-12-01 01:32:06
【问题描述】:
在这个query remove() 方法中有以下实现。
/**
* remove() removes "node" from this DList. If "node" is null, do nothing.
* Performance: runs in O(1) time.
*/
public void remove(DListNode node) {
if((node != null) && (node.listp == this)){
node.prev.next = node.next;
node.next.prev = node.prev;
}
this.size--;
}
这个 remove() 方法执行后,不会有任何指向对象的内向指针,除非DList 类的用户仍然使用某个引用变量指向该节点。
我的问题:
在没有引用指针指向该对象后,垃圾收集器何时以及如何丢弃该对象?因为 GC 如何在没有任何引用的情况下控制该对象?
【问题讨论】:
-
您真的想知道 何时 它发生或只是 如何 它可以在不保留对节点的引用的情况下工作?您的问题标题表示前者,您的文本表示后者。
-
@random6174 它是怎么发生的?什么时候?在 C++ 中,当您编写此类
DList类时,我们还会自行跟踪 memtrack 功能,以在分配更多节点之前检查内存的健康状况。 -
Java 根本没有要求拥有垃圾收集器,不同的实现以不同的方式做到这一点。您保证的只是一个对象在您删除所有强引用之前不会被释放。
-
可能没有对可用于用户代码的对象的引用,但 JVM 仍会跟踪每个对象。事实上在这一点上,谈论“引用”是错误的,因为有几种类型的引用:强引用、软引用、弱引用和幻像,它们都会影响对象与 GC 交互的方式。
-
据我所知,Java GC 保留自己对所有对象的引用,并使用 Mark-And-Sweep 算法删除用户不再(直接或间接)引用的对象。时间未定。