标签:因此 有一个 堆内存 span 内存 nbsp sys 执行 mes
对于Java的垃圾回收器来说,它使用有向图来记录和管理堆内存中的所有对象,通过这个有向图就可以识别哪些对象是“可达的”(有引用变量引用它就是可达的),哪些对象是“不可达的”(没有引用变量引用它就是不可达的),所有“不可达”对象都是可被垃圾回收的。
但对于如下程序:
class A
{
B b;
}
class B
{
A a;
}
public class Test
{
public static void main(String[] args)
{
A a = new A();
a.b = new B();
a.b.a = a;
a = null;
}
}
上面程序中A对象、B对象,它们都“相互”引用,A对象的b属性引用B对象,而B对象的a属性引用A对象,但实际上没有引用变量引用A对象、B对象,因此它们在有向图中依然是不可达的,因此也会被当成垃圾处理。
程序员可以手动执行System.gc(),通知GC运行,但这只是一个通知,而JVM依然有权决定何时进行垃圾回收。
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
标签:因此 有一个 堆内存 span 内存 nbsp sys 执行 mes
原文地址:https://www.cnblogs.com/programb/p/14068398.html