其次
People one = new People();会一直存在,到程序已经执行完毕。
如果one是某个class的成员变量的话,并且如你所言,没有被使用,那么它的生命周期就等同于它所在的这个class的实例的生命周期(但还不等于垃圾收集);如果它是个局部变量的话,其生命周期就是到这个方法结束为止。
class A {
public static void main(String[] args) {
People one = new People();
B b = new B(one);
one = null;
b.start();
}
}
class B extends Thread {
People ppl;
public B(People p) {
ppl = p;
}
public void run() {
while (true) {
if (ppl == null) { //也就是“若指定one = null; 垃圾回收器在回收时回收他。”
System.out.println("我把我的头吃下去!");
}
}
}
}
应该说,People one = new People();这里one是一个强引用。如果一个堆内存地址(就是你new出来的这个对象的地址),没有任何从root可及的指向它的强引用,那么这个地址对应的对象就满足了回收的条件,可能被回收。注意这里如果是软/弱/虚引用,即使可及也仍然会被回收。回收线程是按照分代的算法进行的,分配越迟的对象,越容易被回收,而很早分配的对象,由于在堆内存每次拷贝以后被放到靠后的位置,所以很难被回收。具体的算法细节和这么做的原因,参考一下垃圾回收的资料吧