菜鸟提问:启动垃圾回收时,是否还能创建对象。

jt_bei 2004-09-01 12:09:16
在看《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!!!");
}
}
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jt_bei 2004-09-01
  • 打赏
  • 举报
回复
上面第三行错了,应该是:
如果是这样,直接把 f = true放到finalize结尾不就可以了吗?
jt_bei 2004-09-01
  • 打赏
  • 举报
回复
在释放第1号对象和第5000号对象的时候,对象计数器都是34541个,而此时f为false,应该还可以创建对象啊,难道因为finalize(),系统都不运行主程序了?

如果是这样,直接把 gcrun = true放到finalize结尾不就可以了吗?为什么书上要多此一举来一个if i==47 ? (我这里是if i==5001)
jerrysoft 2004-09-01
  • 打赏
  • 举报
回复
垃圾回收器只回收那些不再使用的对象,与创建对象没有关联。
请楼主在仔细看看垃圾回收器运作方式这个篇幅,垃圾回收器会从stack和static storage两个存储空间上的reference进行深层遍历,追踪不到的对象才会被回收。
String s = new String("now i'm going to dead!");
s = null;
那么在确保没有reference指针指向的情况下,这个字符串就真正死亡了,等待垃圾回收器来回收其空间。
如果从底层reference也遍历不到的reference集同样也会被回收,包括它们指向的对象内存空间。
whbxm2000 2004-09-01
  • 打赏
  • 举报
回复
up
jt_bei 2004-09-01
  • 打赏
  • 举报
回复
哪位高手帮忙看看吧,先谢谢了。
jt_bei 2004-09-01
  • 打赏
  • 举报
回复
回复: jerrysoft(阿吉)
你没有看懂我的意思,我问的不是什么情况下回收(这点书上已经讲的很清楚了),我问的是垃圾回收器在回收那些不再使用的对象的同时,系统是否还会创建新的对象,即创建对象和垃圾回收是否可以交错运行。如果可以,书上那句if i==47的时候停止创建对象的话不就是多余的吗.

你说的“垃圾回收器只回收那些不再使用的对象,与创建对象没有关联”我觉得不对,因为从上面的程序看,在回收第一个到第5000个对象的时候,总的对象数没有增加,我觉得此时候对象创建被暂停了。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧