[英]How does Java garbage collector work here?
在此查询中, 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如何在没有任何引用的情况下控制该对象?
在不再强烈可达对象之后的任何时候,都可以对其进行GC /回收。 当且仅当可以从GC根目录(通过强引用)访问该对象时,该对象才是高度可访问的。 也就是说,GC回收对象( 如果选择回收的对象)仅是无法访问该对象的结果。
现在,Java保证的一件事是, 它将在抛出OOM之前尽其最大努力 (可能不采取任何措施)释放内存。
即使代码中没有强大的引用,也并不意味着JVM不会跟踪对象或对象消失了! 该对象仍然存在 -尽管它不是强可到达(读:不可访问)从用户代码-直到/当这种实际GC'ed。
例如,这允许一些有趣的情况。
终结了一this
-要GC'ed访问的对象! -并且可以“重生”(或“复活”)对象 ,这是不好的。 注意:虽然终结器的调用大致意味着该对象最终将进行GC处理; 不能保证终结器会被称为ever等。
ReferenceQueues和* Reference类型可用于跟踪不再强烈可访问的对象,因此即使仍然可以获取强引用, 也很容易被GC引用-获取该对象将删除可回收状态。
未定义。 下次垃圾收集器运行时可能会发生这种情况(只有当垃圾收集器运行时它才会高兴),但这不能保证-并非每次gc运行都必须清除所有垃圾
Java的GC一旦不再使用它就不会丢弃对象。 相反,GC会不时运行,检查对象的使用情况并清空内存。
您不能告诉GC任意运行,但是可以通过调用System.gc()来请求它运行。 但是,调用gc()不会在此时间运行GC ...它将仅请求系统运行它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.