一个关于回收的菜问题。
如果,我创建了一个实例,比如:People one = new People();但没有任何代码应用它,那么这个实例会被回收吗?多久呢? 问题点数:20、回复次数:13Top
1 楼gernett21(森林狼)回复于 2004-08-01 14:52:46 得分 0
这个实例应该在你程序生命周期内都不会被回收,我认为Top
2 楼zhutouonline(骄阳似火)回复于 2004-08-01 16:23:29 得分 0
但是他没有用呀``垃圾回收器随时可能出来`回收他呀~
(森林狼)
帮忙解释一下呀``这一点我还是不明白呀``Top
3 楼tiger_wkh52741(走走.跑跑.瞧瞧!)回复于 2004-08-01 20:13:08 得分 0
一定会被回收,如果你的程序已经执行完毕!Top
4 楼anihc_001(初生牛犊(I Love Coffe))回复于 2004-08-01 20:24:50 得分 0
java应该会定期在你的程序运行完毕之后,根据优先级原则来自动回收.
具体怎么分配回收时间,这是个动态的问题,没有固定的时间.Top
5 楼gernett21(森林狼)回复于 2004-08-01 22:04:36 得分 0
当一块内存不再被引用时,JVM的垃圾收集机制就会把它收回
但楼主说的情况,虽然该变量没有被使用,但由于声明了这个变量,程序会认为这块内存是有引用的,至于用不用,怎么用应该是调用者自己的事Top
6 楼yunfeitiger(飞云虎)回复于 2004-08-01 22:07:47 得分 0
用玩了java会自动把它塞到垃圾桶里去的,呵呵。Top
7 楼erictang2003()回复于 2004-08-01 22:45:19 得分 0
不会被回收,问题在于你不引用他,那NEW 他干嘛呢?
好象在 C# 中,编译时会提示此变量没有使用,要求你检查.Top
8 楼D_O_N_G(ilmmvilo)回复于 2004-08-01 23:58:00 得分 0
只有当对象为Null时,垃圾回收器在回收时,才回收他。此为动态进行的。
People one = new People();会一直存在,到程序已经执行完毕。
若指定 one = null; 垃圾回收器在回收时回收他。Top
9 楼shine333(enihs)回复于 2004-08-02 00:35:12 得分 10
楼上两个在瞎说
当你这个new出来的对象没有在任何地方被使用,那么,它就会成为一个被垃圾回收的候选人。但是是否回收,何时回收,我们是无从得知的。而且你无法监视它是否被回收。因为一旦你监视了这个对象,它便不再是垃圾回收的候选人。所以所谓“不会被回收”是错误的。换句话说,它是“可能被回收”
所谓
“只有当对象为Null时,垃圾回收器在回收时,才回收他。此为动态进行的。
People one = new People();会一直存在,到程序已经执行完毕。
若指定 one = null; 垃圾回收器在回收时回收他。”
更是胡说八道, 首先我从来没有听说过回收空指针的,
所谓对象为null, 是对将某个变量清null, 使得这个变量原先所引用的这个对象成为一个被垃圾回收的候选人的这种方法的误解。
其次
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("我把我的头吃下去!");
}
}
}
}
Top
10 楼zhengkan(十大杰出神仙)回复于 2004-08-02 12:59:05 得分 10
楼上的也是个一知半解的,faint。Top
11 楼zhengkan(十大杰出神仙)回复于 2004-08-02 13:05:10 得分 0
应该说,People one = new People();这里one是一个强引用。如果一个堆内存地址(就是你new出来的这个对象的地址),没有任何从root可及的指向它的强引用,那么这个地址对应的对象就满足了回收的条件,可能被回收。注意这里如果是软/弱/虚引用,即使可及也仍然会被回收。回收线程是按照分代的算法进行的,分配越迟的对象,越容易被回收,而很早分配的对象,由于在堆内存每次拷贝以后被放到靠后的位置,所以很难被回收。具体的算法细节和这么做的原因,参考一下垃圾回收的资料吧Top
12 楼zrhk(一清二白)回复于 2004-08-02 13:42:48 得分 0
当内存不够用的时候,才会调用垃圾回收器
也可以人为地调用 即System.gc()
Top
13 楼zhengkan(十大杰出神仙)回复于 2004-08-02 14:45:44 得分 0
楼上的,System.gc()不一定保证马上去gc,内存不够也许会gc,也许不会。如果非要等到内存不够再去gc,堆内存早没了。还有如果是winnt内核的系统,内存调度恐怕不是那么简单的,这里也不细说了。关于gc,建议你好好看看相关资料再来发表评论Top




