论述题 4.  垃圾回收器的原理是什么?垃圾回收器是否可以马上回收内存?如何通知虚拟机进行垃圾回收?
【正确答案】在Java语言中,GC(Garbage Collection,垃圾回收)是一个非常重要的概念,它的主要作用是回收程序中不再使用的内存。在使用C/C++语言进行程序开发的时候,开发人员必须非常仔细地管理好内存的分配与释放,如果忘记或者错误地释放内存往往会导致程序运行不正确甚至是程序的崩溃。为了减轻开发人员的工作,同时增加系统的安全性与稳定性,Java语言提供了垃圾回收器来自动检测对象的作用域,实现自动地把不再被使用的存储空间释放掉。具体而言,垃圾回收器主要负责完成3项任务:分配内存、确保被引用对象的内存不被错误地回收以及回收不再被引用的对象的内存空间。
   垃圾回收器的存在,一方面把开发人员从释放内存的复杂的工作中解脱出来,提高了开发人员的生产效率;另外一方面,对开发人员屏蔽了释放内存的方法,可以避免因为开发人员错误地操作内存从而导致应用程序的崩溃,保证了程序的稳定性。但是,垃圾回收也带来了问题,为了实现垃圾回收,垃圾回收器必须跟踪内存的使用情况,释放没用的对象,在完成内存的释放后,还需要处理堆中的碎片,这些操作必定会增加JVM的负担,从而降低程序的执行效率。
   对于对象而言,如果没有任何变量去引用它,那么该对象将不可能被程序访问,因此,可以认为它是垃圾信息,可以被回收。只要有一个以上的变量引用该对象,该对象就不会被垃圾回收。
   对于垃圾回收器来说,它使用有向图来记录和管理堆内存中的所有对象,通过这个有向图就可以识别哪些对象是“可达的”(有引用变量引用它就是可达的),哪些对象是“不可达的”(没有引用变量引用它就是不可达的),所有“不可达”对象都是可被垃圾回收的。如下例所示:
   public class Test
   {
   public static void main(String[]a)
   {
   Integer i1=new Integer(1);
   Integer i2=new Integer(2);
   i2=i1;
   //some other code
   }
   }
   上述代码在执行到语句i2=i1后,内存的引用关系如图所示。
   
【答案解析】