菜鸟提问:启动垃圾回收时,是否还能创建对象。
在看《java编成思想》P148页时遇到的
书上说启动垃圾回收以前,系统会先启动要被回收对象的finalize(),那么系统在运行finalize(这时候有许多对象都要被回收,因此会有多个finalize要运行)的时候,是否允许系统这个期间同时创建对象?
我把程序稍微改了一下,本来想写信问候老师,又怕他老人家笑话此等问题,只好请大家帮忙看看了
class Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
Chair() {
i = ++created;
if(created == 47)
System.out.println("\n"+"已经建立了47个对象"+"\n");
}
public void finalize() {
if (i==1) //---监测在此期间是否还有创建对象------1
System.out.println("在释放第1号对象得时候,已经创建的对象为"+ created );
if (i==5000) //---监测在此期间是否还有创建对象------2
System.out.println("在释放第5000号对象得时候,已经创建的对象为"+ created);
if(!gcrun)
{
gcrun = true;
System.out.println("在建立了" + created + "个对象后,Finalize第一次开始运行");
}
if(i == 5001)
{
f = true; //在释放到5001号对象的时候,停止对象创建开关
}
finalized++;
if(finalized >= created)
System.out.println("All More=" + finalized + " finalized\n");
}
}
public class Garbage2 {
public static void main(String[] args) {
while(!Chair.f) {
new Chair();
new String("To take up space");
}
System.out.println(
"After all Chairs have been created:\n" +
"total created = " + Chair.created +
", total finalized = " + Chair.finalized);
if(args.length > 0) {
if(args[0].equals("gc") ||
args[0].equals("all")) {
System.out.println("gc():Will Be Run!!!");
System.gc();
}
if(args[0].equals("finalize") ||
args[0].equals("all")) {
System.out.println("runFinalization():Will Be Run!!!");
System.runFinalization();
}
}
System.out.println("bye!!!");
}
}
问题点数:20、回复次数:6Top
1 楼jt_bei(飞行船)回复于 2004-09-01 00:15:11 得分 0
在释放第1号对象和第5000号对象的时候,对象计数器都是34541个,而此时f为false,应该还可以创建对象啊,难道因为finalize(),系统都不运行主程序了?
如果是这样,直接把 gcrun = true放到finalize结尾不就可以了吗?为什么书上要多此一举来一个if i==47 ? (我这里是if i==5001)
Top
2 楼jt_bei(飞行船)回复于 2004-09-01 00:40:03 得分 0
上面第三行错了,应该是:
如果是这样,直接把 f = true放到finalize结尾不就可以了吗?Top
3 楼jt_bei(飞行船)回复于 2004-09-01 08:58:15 得分 0
哪位高手帮忙看看吧,先谢谢了。Top
4 楼whbxm2000(学星,向星,摘星,披星)回复于 2004-09-01 09:16:12 得分 0
upTop
5 楼jerrysoft(阿吉)回复于 2004-09-01 09:30:22 得分 20
垃圾回收器只回收那些不再使用的对象,与创建对象没有关联。
请楼主在仔细看看垃圾回收器运作方式这个篇幅,垃圾回收器会从stack和static storage两个存储空间上的reference进行深层遍历,追踪不到的对象才会被回收。
String s = new String("now i'm going to dead!");
s = null;
那么在确保没有reference指针指向的情况下,这个字符串就真正死亡了,等待垃圾回收器来回收其空间。
如果从底层reference也遍历不到的reference集同样也会被回收,包括它们指向的对象内存空间。Top
6 楼jt_bei(飞行船)回复于 2004-09-01 20:06:06 得分 0
回复: jerrysoft(阿吉)
你没有看懂我的意思,我问的不是什么情况下回收(这点书上已经讲的很清楚了),我问的是垃圾回收器在回收那些不再使用的对象的同时,系统是否还会创建新的对象,即创建对象和垃圾回收是否可以交错运行。如果可以,书上那句if i==47的时候停止创建对象的话不就是多余的吗.
你说的“垃圾回收器只回收那些不再使用的对象,与创建对象没有关联”我觉得不对,因为从上面的程序看,在回收第一个到第5000个对象的时候,总的对象数没有增加,我觉得此时候对象创建被暂停了。Top




