引用自百度:
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。 需要注意的是:垃圾回收的是没有被活动对象引用的对象所占据的内存空间而不是对象本身,70%以上的人回答的含义是回收对象,
实际上这是不正确的。 System.gc() Runtime.getRuntime().gc() 上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,即通知javaVM这个是可回收的但不是立即的,
真正垃圾回收机制具体在什么时间点开始发生动作这同样
是不可预料的,这和抢占式的线程在发生作用时的原理一样。
现存谈的是对象和引用,你创建一个Alpha a引用,就等于创建了三个引用,分别是a、a.b1、a.b2。当a被回收时(a=null),那么a.b1与a.b2都不能再使用。 对象只有在没有引用时,才会被标记为垃圾! ============================ Beta b1 = new Beta(); Beta b2 = new Beta(); Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); a1.b1 = b1; a1.b2 = b1; a2.b2 = b2; a1 = null; b1 = null; b2 = null; ============================ 上面代码一共创建了四个对象,我们给这四个对象加个编号。 Beta b1 = new Beta();//1 Beta b2 = new Beta();//2 Alpha a1 = new Alpha();//3,a1是唯一引用 Alpha a2 = new Alpha();//4,a2是唯一引用 下面是引用的指向传递,但对象就上面这四个。 a1.b1 = b1;//该句的作用与下面两句不同,因为a1.b1是静态属性,所以这句等于a2.b1=b1和Alpha.b1=b1。 a1.b2 = b1;//b1、a1.b2、a1.b1、Alpha.b1都指向了1号对象。当然也包括a2.b1 a2.b2 = b2;//b2、a2.b2都指向了2号对象。 ============== 下面是杀死引用的语句 a1 = null;//a1被杀了,那么a1.b1、a1.b2也就都被杀了。 b1 = null;//b1被杀了 b2 = null;//b2被杀了 我们看看编号1和编号2两个对象,还有没有引用指向它们 编号1对象:b1、a1.b2、a1.b1、Alpha.b1、a2.b1,去除a1.b2、a1.b1、b1之后还有a2.b1和Alpha.b1! 编号2对象:b2、a2.b2,去除b2之后还有a2.b2。 所以只回收编号3,即Alpha a1 = new Alpha()被回收了。
垃圾收集,没有句柄指向,即没有被引用。