考虑对象持有对自身的引用的情况。嗯,像这样
public class A {
private A a;
public A() {
a = this;
}
}
在这种情况下,这个类的对象的生命周期是什么?只要有对它们的引用,GC 就不会触及对象。是否遵循这个类的对象至少会保存在内存中,直到我将变量设置a
为空?
考虑对象持有对自身的引用的情况。嗯,像这样
public class A {
private A a;
public A() {
a = this;
}
}
在这种情况下,这个类的对象的生命周期是什么?只要有对它们的引用,GC 就不会触及对象。是否遵循这个类的对象至少会保存在内存中,直到我将变量设置a
为空?
只要对象从所谓的“根”(GC 根)“可访问”(可通过链接访问),它们就不会被删除。
从根无法访问的引用(包括循环引用)不会成为垃圾回收的障碍。
根据所使用的垃圾收集算法的变体,在收集的哪个阶段和何时启动以及在什么基础上将对象划分为所谓的“代”(generations)存在差异,但是,简化的收集方案是对于大多数收藏家来说大致相同:
对象被标记为可达 (MARK)
GC 吃掉无法访问的对象 (SWEEP)
Garbage Collector
使用来自子集的算法对算法的示例性方案进行可视化Mark-Sweep