<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Fantasy's World

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

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      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!");

      }

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

    分析:

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

        if (!gcrun) {

            gcrun = true;

            System.out.println(

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

         }

    就會出現這樣的結果:

    Beginning to finalize after 25038 Chairs have been created

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

    直到有47個對象被清除了,Chair.f被置成true了,創建對象的循環才結束。看main方法中的一段代碼:

        System.out.println(

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

                + "total created ="

                + Chair.created

                + ",total finalized ="

                + Chair.finalized+"\n");

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

    結果可能是這樣的:

    total created =29096,total finalized =73

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

    結論:

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

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

    Feedback

    # re: 關于Garbage.java的思考 2005-12-14 19:10 luffy520
    看了  回復  更多評論
      

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

    主站蜘蛛池模板: 亚洲人成网站免费播放| 亚洲最大免费视频网| 鲁死你资源站亚洲av| 性色av免费观看| 亚洲免费福利在线视频| 久久精品网站免费观看| 亚洲人成片在线观看| 无码人妻一区二区三区免费手机| 亚洲欧洲国产视频| 一二三四视频在线观看中文版免费| 亚洲毛片在线免费观看| 国产大片线上免费观看| 99久久国产亚洲综合精品| 国产麻豆剧传媒精品国产免费| 在线观看亚洲精品专区| 亚洲国产成人爱av在线播放| 成人免费一区二区三区| 亚洲av无码片在线播放| 1000部拍拍拍18勿入免费凤凰福利| 亚洲伊人久久大香线蕉| 国产精品va无码免费麻豆| 一级毛片a女人刺激视频免费| 国产成A人亚洲精V品无码| 国产精品色拉拉免费看| 亚洲欧洲精品成人久久曰| 亚洲女同成人AⅤ人片在线观看| 91成人免费福利网站在线| 亚洲黄色网站视频| 最新69国产成人精品免费视频动漫| 亚洲AV日韩AV无码污污网站| 色噜噜亚洲精品中文字幕| 精品无码AV无码免费专区| 亚洲AV无码成人精品区日韩| 国产亚洲精aa成人网站| 亚洲精品在线免费观看| 精品久久久久久亚洲综合网| 亚洲av无码av制服另类专区| 成在人线AV无码免费| 岛国岛国免费V片在线观看| 亚洲国产精品人久久电影| 无码欧精品亚洲日韩一区夜夜嗨|