CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

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

楼主jt_bei(飞行船)2004-09-01 00:09:16 在 Java / J2SE / 基础类 提问

在看《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

相关问题

  • 垃圾回收的問題
  • 垃圾回收问题
  • 垃圾回收问题
  • 关于垃圾回收
  • 关于垃圾回收
  • 垃圾回收的问题
  • 关于垃圾回收的问题
  • 急!垃圾回收的问题!
  • C#垃圾回收的问题
  • 关于垃圾回收的问题

关键词

  • 垃圾
  • 对象
  • 回收
  • 垃圾回收器
  • 创建
  • gcrun
  • 启动
  • 是否
  • 书
  • 时候

得分解答快速导航

  • 帖主:jt_bei
  • jerrysoft

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo