1、在C/C++中,程序员需要负责对象的创建和销毁。但是有时会忽略无关对象的销毁,由于这种疏忽,有时在创建对象时,可能没有足够的内存,并且整个程序将异常终止,从而导致OutOfMemoryErrors错误。
2、但在Java中,程序员不必担心无用对象的销毁,GC垃圾回收器会自动销毁这些对象。
3、垃圾回收器是Daemon线程的最佳示例,因为它始终在后台运行。
4、垃圾回收器主要目标是通过销毁无法访问的对象来释放堆内存
无法访问的对象:即该对象不存在任何对它的引用,注意,作为隔离岛的一些对象也是不可到达的。
Java中的孤岛:
在Java中,垃圾回收器模块会小心地销毁对象,并且对它们没有任何引用的对象都可以进行垃圾回收。垃圾收集器能够识别这种类型的对象。
孤岛:
- 对象1引用对象2,对象2引用对象1。任何其他对象都没有引用对象1和对象2。那是一个孤立的孤岛。
- 基本上,隔离孤岛是一组互相引用的对象,但是应用程序中的任何活动对象都不会引用它们。严格来说,即使是单个未引用的对象也都是孤立的孤岛。
ublic 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方法之所以被调用两次是因为两个对象都可以进行垃圾回收。这是因为执行t2=null
后我们没有任何外部引用t1和t2对象。
我们只有彼此之间的内部引用(在Test类的实例变量i中)。我们无法调用两个对象的实例变量。因此,无法再次调用任何对象。
Till t2.i = t1 :两个对象都具有外部引用t1和t2。
t1 = null:可以分别通过t2.i和t2到达两个对象。
现在,这两个对象都可以进行垃圾回收,因为我们无法调用它们。这就是众所周知的隔离岛。
Integer i = new Integer(4);
// the new Integer object is reachable via the reference in 'i'
i = null;
// the Integer object is no longer reachable.
- 垃圾收集的资格:如果某个对象不可访问,则据说该对象符合GC(垃圾收集)的条件。在