java内存管理垃圾回收的面试题目

首先得理解Object obj1 = new Object(); obj1只是对象句柄(指向堆中对象的引用)真实的对象被分配在堆空间,由obj1指向堆中的对象。obj2和obj3同上。 
obj1=obj2;是将obj2的引用赋给obj1;也就是说obj1和obj2同时指向先前obj2指向的对象,obj1先前创建的对象已没有引用指向它,这时候obj1先前创建的对象已符合回收标准,obj1= obj3;同上都是赋值引用
只要堆中的对象还有对象句柄指向它,就不符合回收标准。堆中的对象如果没有引用指向它。jvm会在一个不确定的时间执行垃圾收集,这个时间是程序不能控制的,即使手动调用gc,也只是建议jvm执行垃圾收集,jvm并不一定会马上做垃圾收集。
Object obj1 = new Object();/*对象A*/
Object obj2 = new Object();/*对象B*/
Object obj3 = new Object();/*对象C*/
obj1 = obj2;/*1*/
obj1 = obj3;/*2*/
obj3 = null;/*3*/
obj1 = null;/*4*/
java程序员面试宝典上说,到/*4*/这句代码,对象C符合垃圾收集器收集标准,而1,2,3句都没有对象符合回收标准;而我从[java编程艺术](高永强)上看到的类似例子,说的是在/*1*/这句对象A就已经符合回收标准了。确实在/*1*/句的时候对象A已经不可达,但是不同书本上的说法让我很困惑。求解惑!


你可能感兴趣的:(java内存管理垃圾回收的面试题目)