麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

Java的垃圾收集機制

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

  通常,我們把分配出去后,卻無法回收的內存空間稱為"內存滲漏體(Memory Leaks)"。
  
  以上這種程序設計的潛在危險性在java這樣以嚴謹、安全著稱的語言中是不答應的。但是Java語言既不能限制程序員編寫程序的自由性,又不能把聲明對象的部分去除(否則就不是面向對象的程序語言了),那么最好的解決辦法就是從Java程序語言本身的特性入手。于是,Java技術提供了一個系統級的線程(Thread),即垃圾收集器線程(Garbage Collection Thread),來跟蹤每一塊分配出去的內存空間,當Java 虛擬機(Java Virtual Machine)處于空閑循環時,垃圾收集器線程會自動檢查每一快分配出去的內存空間,然后自動回收每一快可以回收的無用的內存塊。
  
  垃圾收集器線程是一種低優先級的線程,在一個Java程序的生命周期中,它只有在內存空閑的時候才有機會運行。它有效地防止了內存滲漏體的出現,并極大可能地節省了寶貴的內存資源。但是,通過Java虛擬機來執行垃圾收集器的方案可以是多種多樣的。
  
  下面介紹垃圾收集器的特點和它的執行機制:
  
  垃圾收集器系統有自己的一套方案來判定哪個內存塊是應該被回收的,哪個是不符合要求暫不回收的。垃圾收集器在一個Java程序中的執行是自動的,不能強制執行,即使程序員能明確地判定出有一塊內存已經無用了,是應該回收的,程序員也不能強制垃圾收集器回收該內存塊。程序員唯一能做的就是通過調用System. gc 方法來"建議"執行垃圾收集器,但其是否可以執行,什么時候執行卻都是不可知的。這也是垃圾收集器的最主要的缺點。當然相對于它給程序員帶來的巨大方便性而言,這個缺點是瑕不掩瑜的。
  
  垃圾收集器的主要特點
  1.垃圾收集器的工作目標是回收已經無用的對象的內存空間,從而避免內存滲漏體的產生,節省內存資源,避免程序代碼的崩潰。
  2.垃圾收集器判定一個對象的內存空間是否無用的標準是:假如該對象不能再被程序中任何一個"活動的部分"所引用,此時我們就說,該對象的內存空間已經無用。所謂"活動的部分",是指程序中某部分參與程序的調用,正在執行過程中,尚未執行完畢。
  3.垃圾收集器線程雖然是作為低優先級的線程運行,但在系統可用內存量過低的時候,它可能會突發地執行來拯救內存資源。當然其執行與否也是不可預知的。
  4.垃圾收集器不可以被強制執行,但程序員可以通過調用System. gc方法來建議執行垃圾收集器。
  5.不能保證一個無用的對象一定會被垃圾收集器收集,也不能保證垃圾收集器在一段Java語言代碼中一定會執行。因此在程序執行過程中被分配出去的內存空間可能會一直保留到該程序執行完畢,除非該空間被重新分配或被其他方法回收。由此可見,完全徹底地根絕內存滲漏體的產生也是不可能的。但是請不要忘記,Java的垃圾收集器究竟使程序員從手工回收內存空間的繁重工作中解脫了出來。設想一個程序員要用C或C++來編寫一段10萬行語句的代碼,那么他一定會充分體會到Java的垃圾收集器的優點!
  6.同樣沒有辦法預知在一組均符合垃圾收集器收集標準的對象中,哪一個會被首先收集。
  7.循環引用對象不會影響其被垃圾收集器收集。
  8.可以通過將對象的引用變量(reference variables,即句柄handles)初始化為null值,來暗示垃圾收集器來收集該對象。但此時,假如該對象連接有事件監聽器(典型的 AWT組件),那它還是不可以被收集。所以在設一個引用變量為null值之前,應注重該引用變量指向的對象是否被監聽,若有,要首先除去監聽器,然后才可以賦空值。
  9.每一個對象都有一個finalize( )方法,這個方法是從Object類繼續來的。
  10.finalize( )方法用往返收內存以外的系統資源,就像是文件處理器和網絡連接器。該方法的調用順序和用來調用該方法的對象的創建順序是無關的。換句話說,書寫程序時該方法的順序和方法的實際調用順序是不相干的。請注重這只是finalize( )方法的特點。
  11.每個對象只能調用finalize( )方法一次。假如在finalize( )方法執行時產生異常(exception),則該對象仍可以被垃圾收集器收集。
  12.垃圾收集器跟蹤每一個對象,收集那些不可到達的對象(即該對象沒有被程序的任何"活的部分"所調用),回收其占有的內存空間。但在進行垃圾收集的時候,垃圾收集器會調用finalize( )方法,通過讓其他對象知道它的存在,而使不可到達的對象再次"復蘇"為可到達的對象。既然每個對象只能調用一次finalize( )方法,所以每個對象也只可能"復蘇"一次。
  13.finalize( )方法可以明確地被調用,但它卻不能進行垃圾收集。
  14.finalize( )方法可以被重載(overload),但只有具備初始的finalize( )方法特點的方法才可以被垃圾收集器調用。
  15.子類的finalize( )方法可以明確地調用父類的finalize( )方法,作為該子類對象的最后一次適當的操作。但Java編譯器卻不認為這是一次覆蓋操作(overriding),所以也不會對其調用進行檢查。
  16.當finalize( )方法尚未被調用時,System. runFinalization( )方法可以用來調用finalize( )方法,并實現相同的效果,對無用對象進行垃圾收集。
  17.當一個方法執行完畢,其中的局部變量就會超出使用范圍,此時可以被當作垃圾收集,但以后每當該方法再次被調用時,其中的局部變量便會被重新創建。
  18.Java語言使用了一種"標記交換區的垃圾收集算法"。該算法會遍歷程序中每一個對象的句柄,為被引用的對象做標記,然后回收尚未做標記的對象。所謂遍歷可以簡單地理解為"檢查每一個"。
  19.Java語言答應程序員為任何方法添加finalize( )方法,該方法會在垃圾收集器交換回收對象之前被調用。但不要過分依靠該方法對系統資源進行回收和再利用,因為該方法調用后的執行結果是不可預知的。
  通過以上對垃圾收集器特點的了解,你應該可以明確垃圾收集器的作用,和垃圾收集器判定一塊內存空間是否無用的標準。簡單地說,當你為一個對象賦值為null并且重新定向了該對象的引用者,此時該對象就符合垃圾收集器的收集標準。
  判定一個對象是否符合垃圾收集器的收集標準,這是SUN公司程序員認證考試中垃圾收集器部分的重要考點(可以說,這是唯一的考點)。所以,考生在一段給定的代碼中,應該能夠判定出哪個對象符合垃圾收集器收集的標準,哪個不符合。下面結合幾種認證考試中可能出現的題型來具體講解:
  Object obj = new Object ( ) ;
  我們知道,obj為Object的一個句柄。當出現new要害字時,就給新建的對象分配內存空間,而obj的值就是新分配的內存空間的首地址,即該對象的值(請非凡注重,對象的值和對象的內容是不同含義的兩個概念:對象的值就是指其內存塊的首地址,即對象的句柄;而對象的內容則是其具體的內存塊)。此時假如有 obj = null; 則obj指向的內存塊此時就無用了,因為下面再沒有調用該變量了。
  
  請再看以下三種認證考試時可能出現的題型:
  程序段1:
  1.fobj = new Object ( ) ;
  2.fobj. Method ( ) ;
  3.fobj = new Object ( ) ;
  4.fobj. Method ( ) ;
  
  問:這段代碼中,fobj在第幾行符合垃圾收集器的收集標準?
  答:第3行。因為第3行的fobj被賦了新值,產生了一個新的對象,即換了一塊新的內存空間,也相當于為第1行中的fobj賦了null值。這種類型的題在認證0考試中是最簡單的。
  
  程序段2:
  1.Object sobj = new Object ( ) ;
  2.Object sobj = null ;
  3.Object sobj = new Object ( ) ;
  4.sobj = new Object ( ) ;
  
  問:這段代碼中,第幾行的內存空間符合垃圾收集器的收集標準?
  答:第1行和第3行。因為第2行為sobj賦值為null,所以在此第1行的sobj符合垃圾收集器的收集標準。而第4行相當于為sobj賦值為null,所以在此第3行的sobj也符合垃圾收集器的收集標準。
  假如有一個對象的句柄a,且你把a作為某個構造器的參數,即 new ConstrUCtor ( a )的時候,即使你給a賦值為null,a也不符合垃圾收集器的收集標準。直到由上面構造器構造的新對象被賦空值時,a才可以被垃圾收集器收集。
  程序段3:
  1.Object aobj = new Object ( ) ;
  2.Object bobj = new Object ( ) ;
  3.Object cobj = new Object ( ) ;
  4.aobj = bobj;
  5.aobj = cobj;
  6.cobj = null;
  7.aobj = null;
  問:這段代碼中,第幾行的內存空間符合垃圾收集器的收集標準?
  答:第7行。注重這類題型是認證考試中可能碰到的最難題型了。
  行1-3分別創建了Object類的三個對象:aobj,bobj,cobj
  行4:此時對象aobj的句柄指向bobj,所以該行的執行不能使aobj符合垃圾收集器的收集標準。
  行5:此時對象aobj的句柄指向cobj,所以該行的執行不能使aobj符合垃圾收集器的收集標準。
  行6:此時仍沒有任何一個對象符合垃圾收集器的收集標準。
  行7:對象cobj符合了垃圾收集器的收集標準,因為cobj的句柄指向單一的地址空間。在第6行的時候,cobj已經被賦值為null,但由cobj同時還指向了aobj(第5行),所以此時cobj并不符合垃圾收集器的收集標準。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說明了,由cobj所指向的地址空間已經被完全地賦予了空值。所以此時cobj最終符合了垃圾收集器的收集標準。 但對于aobj和bobj,仍然無法判定其是否符合收集標準。
  
  總結
  在Java語言中,判定一塊內存空間是否符合垃圾收集器收集標準的標準只有兩個:
  1.給對象

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: fc2国产成人免费视频 | 影视免费观看 | 国产精品区一区二区三区 | 91成人影库| 色吧综合网 | 91 久久| 精品国产91久久久久久久妲己 | 得得啪在线视频 | 国产乱淫a∨片免费视频 | 欧美一级特级 | 亚欧美一区二区 | 久久精品视频1 | 一级毛片在线看 | 一区二区久久精品66国产精品 | 一级毛片在线免费观看视频 | 斗破苍穹在线免费 | 日本中文高清 | 久久久一区二区三区精品 | 日本教室三级在线看 | 香蕉久久久精品 | 欧美三级欧美成人高清www | 国产一区二区三区手机在线 | 久久影院免费观看 | 香蕉视频h | 91精选视频在线观看 | 欧美18一19sex性护士农村 | 亚洲一级片免费观看 | 国产一区二区三区视频在线观看 | www.48xx.com| 中文字幕1区2区 | 精品一区二区三区在线观看国产 | 亚洲精品欧美二区三区中文字幕 | 日本成人二区 | 免费在线国产 | av成人在线电影 | 黄色片网站免费 | 一级视频网站 | 久草手机在线视频 | 国产在线欧美日韩 | 最新午夜综合福利视频 | 91看片在线播放 |