在java中,垃圾收集器模块负责对象销毁,并且没有任何引用的对象可以进行垃圾收集。垃圾收集器能够识别此类对象。
Java中隔离岛:
对象1引用对象2和对象2引用对象1.对象1和对象2都不被任何其他对象引用。那是一个孤立的岛屿Island of Isolation。
基本上,隔离岛Island of Isolation是一组相互引用的对象,但它们不会被应用程序中的任何活动对象引用。严格来说,即使是一个未引用的对象也是一个孤立的岛屿。
例:
public class Test
{
Test i;
public static void main(String[] args)
{
Test t1 = new Test();
Test t2 = new Test();
// Object of t1 gets a copy of t2
t1.i = t2;
// Object of t2 gets a copy of t1
t2.i = t1;
// Till now no object eligible
// for garbage collection
t1 = null;
//now two objects are eligible for
// garbage collection
t2 = null;
// calling garbage collector
System.gc();
}
@Override
protected void finalize() throws Throwable
{
System.out.println("Finalize method called");
}
}
输出:
Finalize method called
Finalize method called
说明:
在销毁对象之前,垃圾收集器最多一次在该对象上调用finalize方法。
在上面的例子中,finalize方法调用两次的原因是因为两个对象有资格进行垃圾收集。这是因为我们在执行后没有对t1和t2对象的任何外部引用t2=null。
我们所拥有的只是彼此之间的内部引用(在类Test的实例变量i中)。我们无法调用两个对象的实例变量。因此,不能再次调用任何对象。
直到t2.i = t1:两个对象都有外部引用t1和t2。
t1 = null:两个对象分别可以通过t2.i和t2到达。
t2 = null:无法访问任何对象。
现在,这两个对象都有资格进行垃圾收集,因为我们无法调用它们。这通常被称为隔离岛。