国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

關(guān)于finalize()方法的解釋

2019-11-17 06:28:29
字體:
供稿:網(wǎng)友

  我在thinking in java中看見以下一段代碼。

//: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.    }
    protected void finalize(){
        if(!gcrun){
            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){
      if(args.length==0){
          System.out.println("Usage:/n"+
              "java Garbage before/n or:/n"+
              "java Garbage after");
          return;
      }
      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[0].equals("before")){
          System.out.println("gc():");
          System.gc();
          System.out.println("runFinalization():");
          System.runFinalization();
      }
      System.out.println("bye");
      if(args[0].equals("after"))
          System.runFinalizersOnExit(true);
    }
}///:-

為什么執(zhí)行java Gerbage before
以后,當(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é)束。看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中這段代碼的想要說明的),可能會在這個對象剛剛“無用”的時候就清除掉了,也可能滯后幾秒,甚至永遠(yuǎn)不清除。

假如你的開發(fā)環(huán)境支持跟蹤的話,你可以以STEP的方式運行,你會看到運行結(jié)果大不相同。給你看看我的運行結(jié)果:
Created 47
Beginning to finalize after25038Chairs have been created
Finalizing Chair #47,Setting flag to stop Chair creation
After all chairs have been created:
total created =45993,total finalized =1800
gc():
runFinalization():
bye
All45993finalized

注重最后一行,因為人為的停頓,JVM有足夠的時間將所有的對象都清除了。

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广汉市| 合江县| 宁国市| 洞头县| 怀宁县| 托克托县| 迭部县| 泌阳县| 静海县| 郧西县| 柳江县| 永寿县| 临邑县| 博野县| 新巴尔虎右旗| 久治县| 苍溪县| 淮南市| 延边| 岳池县| 巴东县| 林口县| 麻江县| 本溪市| 泗水县| 武胜县| 周口市| 基隆市| 扶余县| 孙吴县| 开鲁县| 玉环县| 扬中市| 固镇县| 敦化市| 麻栗坡县| 福清市| 沈阳市| 徐水县| 集贤县| 集贤县|