亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

必須執行清除

2019-11-18 13:21:14
字體:
來源:轉載
供稿:網友

  為清除一個對象,那個對象的用戶必須在希望進行清除的地點調用一個清除方法。這聽起來似乎很輕易做到,但卻與C++“破壞器”的概念稍有抵觸。在C++中,所有對象都會破壞(清除)?;蛘邠Q句話說,所有對象都“應該”破壞。若將C++對象創建成一個本地對象,比如在堆棧中創建(在java中是不可能的),那么清除或破壞工作就會在“結束花括號”所代表的、創建這個對象的作用域的末尾進行。若對象是用new創建的(類似于Java),那么當程序員調用C++的delete命令時(Java沒有這個命令),就會調用相應的破壞器。若程序員忘記了,那么永遠不會調用破壞器,我們最終得到的將是一個內存“漏洞”,另外還包括對象的其他部分永遠不會得到清除。
  相反,Java不答應我們創建本地(局部)對象——無論如何都要使用new。但在Java中,沒有“delete”命令來釋放對象,因為垃圾收集器會幫助我們自動釋放存儲空間。所以假如站在比較簡化的立場,我們可以說正是由于存在垃圾收集機制,所以Java沒有破壞器。然而,隨著以后學習的深入,就會知道垃圾收集器的存在并不能完全消除對破壞器的需要,或者說不能消除對破壞器代表的那種機制的需要(而且絕對不能直接調用finalize(),所以應盡量避免用它)。若希望執行除釋放存儲空間之外的其他某種形式的清除工作,仍然必須調用Java中的一個方法。它等價于C++的破壞器,只是沒后者方便。
  finalize()最有用處的地方之一是觀察垃圾收集的過程。下面這個例子向大家展示了垃圾收集所經歷的過程,并對前面的陳述進行了總結。
  
  //: 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.err.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);
   }
  } ///:~
  
  上面這個程序創建了許多Chair對象,而且在垃圾收集器開始運行后的某些時候,程序會停止創建Chair。由于垃圾收集器可能在任何時間運行,所以我們不能準確知道它在何時啟動。因此,程序用一個名為gcrun的標記來指出垃圾收集器是否已經開始運行。利用第二個標記f,Chair可告訴main()它應停止對象的生成。這兩個標記都是在finalize()內部設置的,它調用于垃圾收集期間。
  另兩個static變量——created以及finalized——分別用于跟蹤已創建的對象數量以及垃圾收集器已進行完收尾工作的對象數量。最后,每個Chair都有它自己的(非static)int i,所以能跟蹤了解它具體的編號是多少。編號為47的Chair進行完收尾工作后,標記會設為true,最終結束Chair對象的創建過程。
  所有這些都在main()的內部進行——在下面這個循環里:
  
  while(!Chair.f) {
  new Chair();
  new String("To take up space");
  }
  
  大家可能會迷惑這個循環什么時候會停下來,因為內部沒有任何改變Chair.f值的語句。然而,finalize()進程會改變這個值,直至最終對編號47的對象進行收尾處理。
  每次循環過程中創建的String對象只是屬于額外的垃圾,用于吸引垃圾收集器——一旦垃圾收集器對可用內存的容量感到“緊張不安”,就會開始關注它。
  運行這個程序的時候,提供了一個命令行自變量“before”或者“after”。其中,“before”自變量會調用System.gc()方法(強制執行垃圾收集器),同時還會調用System.runFinalization()方法,以便進行收尾工作。這些方法都可在Java 1.0中使用,但通過使用“after”自變量而調用的runFinalizersOnExit()方法卻只有Java 1.1及后續版本提供了對它的支持(注釋③)。注重可在程序執行的任何時候調用這個方法,而且收尾程序的執行與垃圾收集器是否運行是無關的。
  
 ?、郏翰恍业氖牵琂ava 1.0采用的垃圾收集器方案永遠不能正確地調用finalize()。因此,finalize()方法(非凡是那些用于關閉文件的)事實上經常都不會得到調用?,F在有些文章聲稱所有收尾模塊都會在程序退出的時候得到調用——即使到程序中止的時候,垃圾收集器仍未針對那些對象采取行動。這并不是真實的情況,所以我們根本不能指望finalize()能為所有對象而調用。非凡地,finalize()在Java 1.0里幾乎毫無用處。
  
  前面的程序向我們揭示出:在Java 1.1中,收尾模塊肯定會運行這一許諾已成為現實——但前提是我們明確地強制它采取這一操作。若使用一個不是“before”或“after”的自變量(如“none”),那么兩個收尾工作都不會進行,而且我們會得到象下面這樣的輸出:
  Created 47
  
  
  Created 47
  Beginning to finalize after 8694 Chairs have been created
  Finalizing Chair #47, Setting flag to stop Chair creation
  After all Chairs have been created:
  total created = 9834, total finalized = 108
  bye!
  
  因此,到程序結束的時候,并非所有收尾模塊都會得到調用。為強制進行收尾工作,可先調用System.gc(),再調用System.runFinalization()。這樣可清除到目前為止沒有使用的所有對象。這樣做一個稍顯希奇的地方是在調用runFinalization()之前調用gc(),這看起來似乎與Sun公司的文檔說明有些抵觸,它宣稱首先運行收尾模塊,再釋放存儲空間。然而,若在這里首先調用runFinalization(),再調用gc(),收尾模塊根本不會執行。
  
  針對所有對象,Java 1.1有時之所以會默認為跳過收尾工作,是由于它認為這樣做的開銷太大。不管用哪種方法強制進行垃圾收集,都可能注重到比沒有額外收尾工作時較長的時間延遲。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人av在线亚洲| 精品网站999www| 国产成人一区二区在线| 国内精品久久久久伊人av| 国产一区二区三区毛片| 午夜精品国产精品大乳美女| 日韩av中文字幕在线播放| 91精品国产91久久久久久最新| 国内精品中文字幕| 亚洲老头同性xxxxx| 欧美午夜影院在线视频| 77777亚洲午夜久久多人| 日本91av在线播放| 欧美午夜宅男影院在线观看| 草民午夜欧美限制a级福利片| 久久成人综合视频| 97在线视频免费| 欧美性videos高清精品| 国产精品久久久久福利| 国产精品wwwwww| 91爱爱小视频k| 国产精品美女无圣光视频| 欧美高清不卡在线| 国产精品日韩欧美综合| 亚洲免费成人av电影| 在线亚洲男人天堂| 亚洲欧美日韩一区二区在线| 日韩中文字幕第一页| 日韩av一区二区在线| 亚洲人成网站免费播放| 欧美日本啪啪无遮挡网站| 成人乱人伦精品视频在线观看| 国产mv久久久| 91欧美精品午夜性色福利在线| 精品美女永久免费视频| 成人欧美一区二区三区在线| 欧美日韩在线第一页| 日韩成人激情在线| 欧美极品少妇xxxxⅹ裸体艺术| 国产日韩精品综合网站| 精品亚洲aⅴ在线观看| 欧美性色视频在线| 欧美午夜精品久久久久久浪潮| 亚洲免费一级电影| 国语自产精品视频在免费| 成人国产精品免费视频| 国产精品嫩草影院久久久| 国产成人涩涩涩视频在线观看| 亚洲国产精品推荐| 丝袜一区二区三区| 亚洲综合一区二区不卡| 亚洲高清av在线| 欧美成人午夜免费视在线看片| 91免费版网站入口| 色妞欧美日韩在线| 久久久噜噜噜久久| 国产欧美精品一区二区三区介绍| 91国语精品自产拍在线观看性色| 韩国精品久久久999| 日韩在线观看免费高清| 17婷婷久久www| 国产999精品久久久影片官网| 精品中文字幕在线观看| 国产精品27p| 日韩欧美成人区| 日韩美女写真福利在线观看| 国产欧美日韩高清| 国产va免费精品高清在线| 91亚洲精品久久久久久久久久久久| 国产精品九九久久久久久久| 97视频人免费观看| 亚洲欧美另类中文字幕| 亚洲精品久久久久中文字幕欢迎你| 成人免费观看49www在线观看| 欧美一区二区三区……| 成人a级免费视频| 夜夜躁日日躁狠狠久久88av| 欧美精品在线第一页| 欧美精品videossex性护士| 国产成人久久精品| 成人a免费视频| 久久久国产成人精品| 欧美精品在线播放| 久99九色视频在线观看| 中文字幕欧美国内| 日韩中文字幕视频| 亚洲伊人久久综合| 国产精品久久色| 国产精品444| 色婷婷综合久久久久| 亚洲天堂视频在线观看| 2019中文字幕免费视频| 国模精品系列视频| 欧美日韩综合视频网址| 在线视频日本亚洲性| 97视频在线观看成人| 亚洲国产古装精品网站| www.国产一区| 91精品国产网站| 精品国产一区二区在线| 国模精品一区二区三区色天香| 亚洲精品国产精品自产a区红杏吧| 久久激情视频免费观看| 欧美一级电影久久| 国产91热爆ts人妖在线| 热99在线视频| 国内免费精品永久在线视频| 亚洲最大福利视频网| 亚洲国产精品电影在线观看| 欧美日韩激情网| 欧美日韩一区二区三区在线免费观看| 亚洲欧美激情另类校园| 国产一区av在线| 国产亚洲精品成人av久久ww| 亚洲欧美激情一区| 国产成人91久久精品| 91精品久久久久久久久久久久久| 欧美日韩免费一区| 国产精品自产拍在线观看中文| 日韩av影视在线| 亚洲精品视频播放| 日韩av在线免费| 久久天堂电影网| 亚洲国产精品资源| 精品国产一区二区三区久久狼黑人| 国产精品久久久久久久久久久久久久| 麻豆国产va免费精品高清在线| 欧美激情一区二区三区在线视频观看| 亚洲成人免费网站| 日韩精品小视频| 国产精品福利在线观看网址| 久久久久亚洲精品国产| 久久偷看各类女兵18女厕嘘嘘| 国产日韩欧美夫妻视频在线观看| 欧美日韩国产一区二区三区| 欧美激情亚洲自拍| 97热在线精品视频在线观看| 亚洲欧美日韩一区二区三区在线| 精品国产精品自拍| 亚洲免费中文字幕| 久久久久久久久久婷婷| 亚洲男人天堂古典| 国产成人一区二区三区| 欧美激情第一页xxx| 国产精品久久久久久久久久99| 亚洲a成v人在线观看| 精品一区二区三区三区| 国产成人精品优优av| 欧美久久精品一级黑人c片| 欧美成人亚洲成人| 国产日韩欧美电影在线观看| 2019中文字幕在线观看| 欧美日韩国产中文精品字幕自在自线| 91网站在线免费观看| 欧美激情xxxx| 在线播放日韩av| 欧美成人h版在线观看| 国产精品私拍pans大尺度在线| 热99精品里视频精品| 欧美国产极速在线| 亚洲视频999| 国产精欧美一区二区三区| 狠狠躁夜夜躁久久躁别揉| 国产精品自产拍在线观看|