Fantasy's World

          世界的小世界,我的大世界^_^

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            6 Posts :: 0 Stories :: 16 Comments :: 0 Trackbacks
          《thinking in java》中一段代碼剖析

          程序代碼

          //chapter03:Garbage.java

          // Demonstration of the garbage

          // collector and finalization

          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("Created 47");

            }

            public void finalize() {

              if(!gcrun) {

                // The first time finalize() is called:

                gcrun = true;

                System.out.println(

                  "Beginning to finalize after " +

                  created + " Chairs have been created");

              }

              if(i == 47) {

                System.out.println(

                  "Finalizing Chair #47, " +

                  "Setting flag to stop Chair creation");

                f = true;

              }

              finalized++;

              if(finalized >= created)

                System.out.println(

                  "All " + finalized + " finalized");

            }

          }

          public class Garbage {

            public static void main(String[] args) {

              // As long as the flag hasn't been set,

              // make Chairs and Strings:

              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);

              // Optional arguments force garbage

              // collection & finalization:

              if(args.length > 0) {

                if(args[0].equals("gc") &line;&line;

                   args[0].equals("all")) {

                  System.out.println("gc():");

                  System.gc();

                }

                if(args[0].equals("finalize") &line;&line;

                   args[0].equals("all")) {

                  System.out.println("runFinalization():");

                  System.runFinalization();

                }

              }

              System.out.println("bye!");

            }

          } ///:~為什么執(zhí)行java Garbage gc以后,當(dāng)所有對象創(chuàng)建完(比如8000個),這時只清除了2000個(不定),應(yīng)該只能創(chuàng)建47個對象啊

          分析:

          首先,在一個循環(huán)當(dāng)中創(chuàng)建對象,并且只是創(chuàng)建,而不引用,也就是說這個對象會自動的被系統(tǒng)當(dāng)作垃圾處理掉。但請注意,finalize()方法并不是立刻就會執(zhí)行的,執(zhí)行的時間完全由系統(tǒng)來決定。所以很有可能的情況是已經(jīng)創(chuàng)建了20000個對象,才開始其中的某一個對象的清除工作(這可能和時間或者系統(tǒng)內(nèi)容的占用有關(guān))。看finalize()方法中的一段代碼:

              if (!gcrun) {

                  gcrun = true;

                  System.out.println(

                      "\nBeginning to finalize after" + created + "Chairs have been created\nat ");

               }

          就會出現(xiàn)這樣的結(jié)果:

          Beginning to finalize after 25038 Chairs have been created

          這時對象的創(chuàng)建過程仍在繼續(xù)(因為已經(jīng)Finalize的對象還不滿47個,Chair.f還是false)。所以Chair.created會繼續(xù)增加。

          直到有47個對象被清除了,Chair.f被置成true了,創(chuàng)建對象的循環(huán)才結(jié)束???SPAN lang=EN-US>main方法中的一段代碼:

              System.out.println(

                  "\nAfter all chairs have been created:\n"

                      + "total created ="

                      + Chair.created

                      + ",total finalized ="

                      + Chair.finalized+"\n");

          如上所說,Chair.created是不斷增加的,而在這段代碼執(zhí)行之前,又會有N個對象被釋放掉了,所以finalized也增加了。

          結(jié)果可能是這樣的:

          total created =29096,total finalized =73

          其實這一過程和使用的JVM有很大關(guān)系,執(zhí)行結(jié)果可能會很不相同。但有一點是可以肯定的,那就是我們無法確定JVM什么時候做對象的清除工作(這也是Thinking in java中這段代碼的想要說明的),可能會在這個對象剛剛無用的時候就清除掉了,也可能滯后幾秒,甚至永遠不清除。

          結(jié)論:

          不能指望finalize()方法能穩(wěn)定的工作,尤其不能依靠它來做文件的關(guān)閉等操作,由于finalize()的不確定性,往往得不到你想要的結(jié)果。事實上我們只需要知道所有無用的對象,JVM會自己清除就夠了。省點心思去睡覺豈不是更好的一件事情 :)

          posted on 2005-11-01 13:05 FinalFantasy 閱讀(821) 評論(2)  編輯  收藏 所屬分類: 讀書筆記

          Feedback

          # re: 關(guān)于Garbage.java的思考 2005-12-14 19:10 luffy520
          看了  回復(fù)  更多評論
            

          # re: 關(guān)于Garbage.java的思考 2006-01-05 16:43 餓額
          感覺不是那么回事
          你的解釋有點問題?  回復(fù)  更多評論
            

          主站蜘蛛池模板: 海淀区| 石泉县| 安塞县| 宣城市| 抚顺市| 股票| 乐昌市| 襄汾县| 洪湖市| 普格县| 墨玉县| 和林格尔县| 温泉县| 游戏| 承德县| 惠安县| 梁山县| 嘉荫县| 钟山县| 大余县| 德清县| 蛟河市| 手游| 十堰市| 寻甸| 万源市| 饶平县| 洞口县| 集安市| 大方县| 江山市| 道孚县| 南平市| 兴义市| 搜索| 吕梁市| 奈曼旗| 丰城市| 井冈山市| 辰溪县| 纳雍县|