国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳細(xì)介紹Java語言的垃圾收集器

開發(fā) 后端
本文介紹的是java程序設(shè)計語言中的垃圾啊收集器,希望對你有幫助,一起來看吧!

垃圾收集器是Java語言區(qū)別于其他程序設(shè)計語言的一大特色。它把程序員從手工回收內(nèi)存空間的繁重工作中解脫了出來。在SUN公司的Java程序員(Java Programmer)認(rèn)證考試中,垃圾收集器是必考的內(nèi)容,一般最多可以占總分值的6%左右。

但是由于SUN公司的Java Programming Language SL-275 課程的標(biāo)準(zhǔn)教材中,對有關(guān)垃圾收集器的內(nèi)容只做了非常簡單的介紹,而另外的一些關(guān)于Java技術(shù)的書籍,比如《Java 2 核心技術(shù)》(Core Java 2)、《Java編程思想》(Thinking in Java)、《精通Java 2》等等,里面關(guān)于垃圾收集器的內(nèi)容也幾乎沒有,或者只是簡單地提兩句,所以很多參加Java Programmer認(rèn)證考試的中國考生,在垃圾收集器這一部分的得分都為0分(筆者曾熟悉一位SUN公司授權(quán)的中國Java培訓(xùn)班的老師,其考試總分為89%,但垃圾收集器的部分竟然也為0分)。鑒于此,筆者總結(jié)了這個垃圾收集器的專題,希望對廣大Java技術(shù)的愛好者和預(yù)備認(rèn)證考試的考生們有所幫助。

我們知道,許多程序設(shè)計語言都答應(yīng)在程序運行期動態(tài)地分配內(nèi)存空間。分配內(nèi)存的方式多種多樣,取決于該種語言的語法結(jié)構(gòu)。但不論是哪一種語言的內(nèi)存分配方式,***都要返回所分配的內(nèi)存塊的起始地址,即返回一個指針到內(nèi)存塊的首地址。

當(dāng)已經(jīng)分配的內(nèi)存空間不再需要時,換句話說當(dāng)指向該內(nèi)存塊的句柄超出了使用范圍的時候,該程序或其運行環(huán)境就應(yīng)該回收該內(nèi)存空間,以節(jié)省寶貴的內(nèi)存資源。

在C,C++或其他程序設(shè)計語言中,無論是對象還是動態(tài)配置的資源或內(nèi)存,都必須由程序員自行聲明產(chǎn)生和回收,否則其中的資源將消耗,造成資源的浪費甚至死機。但手工回收內(nèi)存往往是一項復(fù)雜而艱巨的工作。因為要預(yù)先確定占用的內(nèi)存空間是否應(yīng)該被回收是非常困難的!假如一段程序不能回收內(nèi)存空間,而且在程序運行時系統(tǒng)中又沒有了可以分配的內(nèi)存空間時,這段程序就只能崩潰。通常,我們把分配出去后,卻無法回收的內(nèi)存空間稱為"內(nèi)存滲漏體(Memory Leaks)"。

以上這種程序設(shè)計的潛在危險性在Java這樣以嚴(yán)謹(jǐn)、安全著稱的語言中是不答應(yīng)的。但是Java語言既不能限制程序員編寫程序的自由性,又不能把聲明對象的部分去除(否則就不是面向?qū)ο蟮某绦蛘Z言了),那么***的解決辦法就是從Java程序語言本身的特性入手。于是,Java技術(shù)提供了一個系統(tǒng)級的線程(Thread),即垃圾收集器線程(Garbage Collection Thread),來跟蹤每一塊分配出去的內(nèi)存空間,當(dāng)Java 虛擬機(Java Virtual Machine)處于空閑循環(huán)時,垃圾收集器線程會自動檢查每一快分配出去的內(nèi)存空間,然后自動回收每一快可以回收的無用的內(nèi)存塊。

垃圾收集器線程是一種低優(yōu)先級的線程,在一個Java程序的生命周期中,它只有在內(nèi)存空閑的時候才有機會運行。它有效地防止了內(nèi)存滲漏體的出現(xiàn),并極大可能地節(jié)省了寶貴的內(nèi)存資源。但是,通過Java虛擬機來執(zhí)行垃圾收集器的方案可以是多種多樣的。

下面介紹垃圾收集器的特點和它的執(zhí)行機制:

垃圾收集器系統(tǒng)有自己的一套方案來判定哪個內(nèi)存塊是應(yīng)該被回收的,哪個是不符合要求暫不回收的。垃圾收集器在一個Java程序中的執(zhí)行是自動的,不能強制執(zhí)行,即使程序員能明確地判定出有一塊內(nèi)存已經(jīng)無用了,是應(yīng)該回收的,程序員也不能強制垃圾收集器回收該內(nèi)存塊。程序員唯一能做的就是通過調(diào)用System. gc 方法來"建議"執(zhí)行垃圾收集器,但其是否可以執(zhí)行,什么時候執(zhí)行卻都是不可知的。這也是垃圾收集器的最主要的缺點。當(dāng)然相對于它給程序員帶來的巨大方便性而言,這個缺點是瑕不掩瑜的。

垃圾收集器的主要特點有:

1.垃圾收集器的工作目標(biāo)是回收已經(jīng)無用的對象的內(nèi)存空間,從而避免內(nèi)存滲漏體的產(chǎn)生,節(jié)省內(nèi)存資源,避免程序代碼的崩潰。

2.垃圾收集器判定一個對象的內(nèi)存空間是否無用的標(biāo)準(zhǔn)是:假如該對象不能再被程序中任何一個"活動的部分"所引用,此時我們就說,該對象的內(nèi)存空間已經(jīng)無用。所謂"活動的部分",是指程序中某部分參與程序的調(diào)用,正在執(zhí)行過程中,尚未執(zhí)行完畢。

3.垃圾收集器線程雖然是作為低優(yōu)先級的線程運行,但在系統(tǒng)可用內(nèi)存量過低的時候,它可能會突發(fā)地執(zhí)行來拯救內(nèi)存資源。當(dāng)然其執(zhí)行與否也是不可預(yù)知的。

4.垃圾收集器不可以被強制執(zhí)行,但程序員可以通過調(diào)用System. gc方法來建議執(zhí)行垃圾收集器。

5.不能保證一個無用的對象一定會被垃圾收集器收集,也不能保證垃圾收集器在一段Java語言代碼中一定會執(zhí)行。因此在程序執(zhí)行過程中被分配出去的內(nèi)存空間可能會一直保留到該程序執(zhí)行完畢,除非該空間被重新分配或被其他方法回收。由此可見,完全徹底地根絕內(nèi)存滲漏體的產(chǎn)生也是不可能的。但是請不要忘記,Java的垃圾收集器究竟使程序員從手工回收內(nèi)存空間的繁重工作中解脫了出來。設(shè)想一個程序員要用C或C++來編寫一段10萬行語句的代碼,那么他一定會充分體會到Java的垃圾收集器的優(yōu)點!

6.同樣沒有辦法預(yù)知在一組均符合垃圾收集器收集標(biāo)準(zhǔn)的對象中,哪一個會被首先收集。

7.循環(huán)引用對象不會影響其被垃圾收集器收集。

8.可以通過將對象的引用變量(reference variables,即句柄handles)初始化為null值,來暗示垃圾收集器來收集該對象。但此時,假如該對象連接有事件監(jiān)聽器(典型的AWT組件),那它還是不可以被收集。所以在設(shè)一個引用變量為null值之前,應(yīng)注重該引用變量指向的對象是否被監(jiān)聽,若有,要首先除去監(jiān)聽器,然后才可以賦空值。

9.每一個對象都有一個finalize( )方法,這個方法是從Object類繼續(xù)來的。

10.finalize( )方法用往返收內(nèi)存以外的系統(tǒng)資源,就像是文件處理器和網(wǎng)絡(luò)連接器。該方法的調(diào)用順序和用來調(diào)用該方法的對象的創(chuàng)建順序是無關(guān)的。換句話說,書寫程序時該方法的順序和方法的實際調(diào)用順序是不相干的。請注重這只是finalize( )方法的特點。

11.每個對象只能調(diào)用finalize( )方法一次。假如在finalize( )方法執(zhí)行時產(chǎn)生異常(exception),則該對象仍可以被垃圾收集器收集。

12.垃圾收集器跟蹤每一個對象,收集那些不可到達(dá)的對象(即該對象沒有被程序的任何"活的部分"所調(diào)用),回收其占有的內(nèi)存空間。但在進(jìn)行垃圾收集的時候,垃圾收集器會調(diào)用finalize( )方法,通過讓其他對象知道它的存在,而使不可到達(dá)的對象再次"復(fù)蘇"為可到達(dá)的對象。既然每個對象只能調(diào)用一次finalize( )方法,所以每個對象也只可能"復(fù)蘇"一次。

13.finalize( )方法可以明確地被調(diào)用,但它卻不能進(jìn)行垃圾收集。

14.finalize( )方法可以被重載(overload),但只有具備初始的finalize( )方法特點的方法才可以被垃圾收集器調(diào)用。

15.子類的finalize( )方法可以明確地調(diào)用父類的finalize( )方法,作為該子類對象的***一次適當(dāng)?shù)牟僮鳌5獼ava編譯器卻不認(rèn)為這是一次覆蓋操作(overriding),所以也不會對其調(diào)用進(jìn)行檢查。

16.當(dāng)finalize( )方法尚未被調(diào)用時,System. runFinalization( )方法可以用來調(diào)用finalize( )方法,并實現(xiàn)相同的效果,對無用對象進(jìn)行垃圾收集。

17.當(dāng)一個方法執(zhí)行完畢,其中的局部變量就會超出使用范圍,此時可以被當(dāng)作垃圾收集,但以后每當(dāng)該方法再次被調(diào)用時,其中的局部變量便會被重新創(chuàng)建。

18.Java語言使用了一種"標(biāo)記交換區(qū)的垃圾收集算法"。該算法會遍歷程序中每一個對象的句柄,為被引用的對象做標(biāo)記,然后回收尚未做標(biāo)記的對象。所謂遍歷可以簡單地理解為"檢查每一個"。

19.Java語言答應(yīng)程序員為任何方法添加finalize( )方法,該方法會在垃圾收集器交換回收對象之前被調(diào)用。但不要過分依靠該方法對系統(tǒng)資源進(jìn)行回收和再利用,因為該方法調(diào)用后的執(zhí)行結(jié)果是不可預(yù)知的。

通過以上對垃圾收集器特點的了解,你應(yīng)該可以明確垃圾收集器的作用,和垃圾收集器判定一塊內(nèi)存空間是否無用的標(biāo)準(zhǔn)。簡單地說,當(dāng)你為一個對象賦值為null并且重新定向了該對象的引用者,此時該對象就符合垃圾收集器的收集標(biāo)準(zhǔn)。

判定一個對象是否符合垃圾收集器的收集標(biāo)準(zhǔn),這是SUN公司程序員認(rèn)證考試中垃圾收集器部分的重要考點(可以說,這是唯一的考點)。所以,考生在一段給定的代碼中,應(yīng)該能夠判定出哪個對象符合垃圾收集器收集的標(biāo)準(zhǔn),哪個不符合。下面結(jié)合幾種認(rèn)證考試中可能出現(xiàn)的題型來具體講解:

  1. Object obj = new Object ( ) ;  

我們知道,obj為Object的一個句柄。當(dāng)出現(xiàn)new要害字時,就給新建的對象分配內(nèi)存空間,而obj的值就是新分配的內(nèi)存空間的首地址,即該對象的值(請非凡注重,對象的值和對象的內(nèi)容是不同含義的兩個概念:對象的值就是指其內(nèi)存塊的首地址,即對象的句柄;而對象的內(nèi)容則是其具體的內(nèi)存塊)。此時假如有obj = null;則obj指向的內(nèi)存塊此時就無用了,因為下面再沒有調(diào)用該變量了。

請再看以下三種認(rèn)證考試時可能出現(xiàn)的題型:

程序段1:

  1. fobj = new Object ( ) ;   
  2. fobj. Method ( ) ;   
  3. fobj = new Object ( ) ;   
  4. fobj. Method ( ) ;  

問:這段代碼中,第幾行的fobj 符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第3行。因為第3行的fobj被賦了新值,產(chǎn)生了一個新的對象,即換了一塊新的內(nèi)存空間,也相當(dāng)于為第1行中的fobj賦了null值。這種類型的題在認(rèn)證0考試中是最簡單的。

程序段2:

  1. Object sobj = new Object ( ) ;   
  2. Object sobj = null ;   
  3. Object sobj = new Object ( ) ;   
  4. sobj = new Object ( ) ;  

問:這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第1行和第3行。因為第2行為sobj賦值為null,所以在此第1行的sobj符合垃圾收集器的收集標(biāo)準(zhǔn)。而第4行相當(dāng)于為sobj賦值為null,所以在此第3行的sobj也符合垃圾收集器的收集標(biāo)準(zhǔn)。

假如有一個對象的句柄a,且你把a作為某個構(gòu)造器的參數(shù),即new ConstrUCtor ( a )的時候,即使你給a賦值為null,a也不符合垃圾收集器的收集標(biāo)準(zhǔn)。直到由上面構(gòu)造器構(gòu)造的新對象被賦空值時,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;  

問:這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?

答:第7行。注重這類題型是認(rèn)證考試中可能碰到的最難題型了。

行1-3分別創(chuàng)建了Object類的三個對象:aobj,bobj,cobj 

行4:此時對象aobj的句柄指向bobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。

行5:此時對象aobj的句柄指向cobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。

行6:此時仍沒有任何一個對象符合垃圾收集器的收集標(biāo)準(zhǔn)。

行7:對象cobj符合了垃圾收集器的收集標(biāo)準(zhǔn),因為cobj的句柄指向單一的地址空間。在第6行的時候,cobj已經(jīng)被賦值為null,但由cobj同時還指向了aobj(第5行),所以此時cobj并不符合垃圾收集器的收集標(biāo)準(zhǔn)。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說明了,由cobj所指向的地址空間已經(jīng)被完全地賦予了空值。所以此時cobj最終符合了垃圾收集器的收集標(biāo)準(zhǔn)。但對于aobj和bobj,仍然無法判定其是否符合收集標(biāo)準(zhǔn)。

總之,在Java語言中,判定一塊內(nèi)存空間是否符合垃圾收集器收集標(biāo)準(zhǔn)的標(biāo)準(zhǔn)只有兩個:

1.給對象賦予了空值null,以下再沒有調(diào)用過。

2.給對象賦予了新值,既重新分配了內(nèi)存空間。

***再次提醒一下,一塊內(nèi)存空間符合了垃圾收集器的收集標(biāo)準(zhǔn),并不意味著這塊內(nèi)存空間就一定會被垃圾收集器收集。

 

責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2022-07-25 10:15:29

垃圾收集器Java虛擬機

2023-11-16 08:00:56

Java11G1

2009-10-30 10:47:48

VB.NET垃圾收集器

2017-09-21 14:40:06

jvm算法收集器

2011-05-10 16:04:45

Java垃圾收集器

2024-08-26 08:58:50

2024-12-30 08:03:08

2013-12-19 09:46:04

垃圾收集器

2024-03-27 10:27:35

延遲垃圾收集器

2022-04-19 11:25:31

JVMZGC垃圾收集器

2024-03-14 09:00:00

2015-06-17 14:10:52

OracleJava 9垃圾收集器

2011-12-20 10:43:21

Java

2020-02-25 22:01:36

理解JVM垃圾收集器

2021-08-15 18:59:13

垃圾收集器JDK

2025-07-11 02:33:00

JVM垃圾回收

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2011-06-28 12:39:34

Java垃圾回收

2010-01-14 11:28:54

JVM分代垃圾回收

2024-04-07 00:00:00

垃圾收集器內(nèi)存
點贊
收藏

51CTO技術(shù)棧公眾號

欧美第十八页| 国产原创一区二区| 欧美精品一区二区久久婷婷| 国产成人一区二区三区别| 99精品视频在线观看免费播放 | 国产美女精品久久久| 91综合国产| 在线观看一区二区精品视频| 亚洲国产精品毛片av不卡在线| 久久久蜜桃一区二区人| 国产成人一区二区三区小说| 欧美性aaa| 日韩一区二区精品在线观看| av福利导福航大全在线播放| 成年人网站91| 日韩成人av电影在线| 99国产精品一区二区| 欧美激情视频免费观看| 精品成人av| 亚洲成人三级在线| av网站无病毒在线| 婷婷久久综合九色综合绿巨人| 五月婷婷深爱五月| 成人黄色在线网站| 亚洲午夜精品久久久中文影院av| 成久久久网站| 欧美在线观看网址综合| 天堂久久av| 亚洲日本aⅴ片在线观看香蕉| 亚洲s色大片| 色屁屁一区二区| 欧美vide| 午夜伦欧美伦电影理论片| 最近中文字幕2019第二页视频| 91视频你懂的| 国产成人无码精品久久久性色| 国产福利不卡视频| 国产人妻人伦精品| 国产91精品免费| 青春草国产视频| 成人精品免费网站| 国产va亚洲va在线va| 国产白丝网站精品污在线入口| 亚洲成人18| 久久久噜噜噜久久狠狠50岁| 欧美性大战久久久久| 久久一综合视频| 四虎一区二区| 国产一二精品视频| 玩弄中年熟妇正在播放| 久久夜色精品一区| 99热在线免费播放| 一区二区三区在线免费| 三级网站在线| 欧美午夜寂寞影院| 亚洲精品白浆| 中文字幕精品国产| 风间由美一区二区av101| 97成人在线视频| 久久综合电影| 精品一区日韩成人| 国内精品伊人久久久久av影院| 欧美精品久久久久久久自慰| 国产亚洲污的网站| 午夜成在线www| 91麻豆精品国产91久久久资源速度| 四季久久免费一区二区三区四区| 国产丝袜一区视频在线观看| 成人免费视频观看| **欧美日韩vr在线| 国内激情久久| 伊人再见免费在线观看高清版| 国产丝袜在线精品| 欧美另类极限扩张| 日韩一区二区三区四区| 国产成人午夜性a一级毛片| 国内精品久久久久影院优| 亚洲成人精选| 制服丝袜综合日韩欧美| 久久久蜜桃精品| 欧美人体大胆444www| 日韩av影视在线| 国产精品qvod| 精品国产免费人成电影在线观...| 日韩不卡一二三区| 超碰在线人人爱| 欧美手机在线视频| 欧美日韩在线精品一区二区三区激情综合 | 亚洲图片都市激情| 国产日韩欧美在线一区| 日本一区二区三区在线观看视频| 精品对白一区国产伦| 1313精品午夜理伦电影| 亚洲综合小说区| 国产揄拍国内精品对白| 免费h片在线| 91精品国产一区二区三区蜜臀| 99久久久国产| 国产精品露出视频| 久久九九久久九九| 成年视频在线观看| 日韩av手机在线| 久久aⅴ国产欧美74aaa| 午夜影院免费| 亚洲天堂av综合网| 欧美日韩三级| 中文字幕亚洲乱码| 亚洲激情小视频| 亚洲精品久久久| 久久人妻精品白浆国产| 欧美一区二区在线看| 中文字幕伦av一区二区邻居| 一区二区三区偷拍| 欧美午夜丰满在线18影院| 天天综合在线观看| 久久99精品国产一区二区三区| 欧美极品aⅴ影院| h片在线观看视频免费免费| 成人中文字幕在线观看| 国产三级一区二区三区| 国产直播在线| 久久久综合亚洲91久久98| 亚洲一卡二卡三卡四卡五卡| 亚洲18在线| 正在播放91九色| 欧美三级欧美一级| 国产99精品| 任你操这里只有精品| 日韩激情第一页| 亚洲一区二区三区高清| 午夜国产在线| 国产91在线播放| 国产欧美日韩在线看| 激情开心成人网| 视频一区二区综合| 欧美日韩成人在线| 综合激情视频| 绯色av一区| 欧美中文字幕在线播放| 久久综合狠狠综合久久综合88 | 国产精品久久久久免费| ...xxx性欧美| 99久久久国产| 17c丨国产丨精品视频| 欧美一区二区三区性视频| 91精品久久久久久久久久不卡| 日日噜噜噜夜夜爽爽狠狠视频| 久久久免费电影| 国产偷国产偷亚洲高清人白洁| 全球中文成人在线| 国产a级片网站| 色琪琪综合男人的天堂aⅴ视频| 狠狠色丁香久久婷婷综合丁香| 久久不射影院| 亚洲欧洲免费无码| 日韩成人av网址| 狠狠色丁香久久婷婷综合_中| 国模私拍视频在线播放| 日韩精品欧美在线| 精品蜜桃在线看| 七七婷婷婷婷精品国产| 国产丝袜精品丝袜| 视频在线99re| 日韩精品高清视频| 国产成人精品午夜视频免费| 亚洲成人va| 男人女人黄一级| 性亚洲最疯狂xxxx高清| 国产精品久久久久四虎| 日日天天久久| 最猛黑人系列在线播放| 51国产成人精品午夜福中文下载| 欧美午夜精品一区二区三区| 999亚洲国产精| 精品一性一色一乱农村| 久久视频免费在线| 久久精品小视频| 中文字幕一区二区三区四区不卡| 国产一区三区在线播放| 伊大人久久香线焦宗合一75大| wwwxx欧美| 欧美精品一区二区三区蜜桃| 大尺度一区二区| jizz性欧美23| 婷婷亚洲一区二区三区| 欧美日韩中文国产一区发布| 亚洲午夜国产成人av电影男同| 2014亚洲片线观看视频免费| 国产探花在线精品一区二区| av在线免费观看网| 午夜久久久久久久久久久| 欧美国产日韩中文字幕在线| 亚洲国产精品久久久久秋霞影院 | 欧美男女交配视频| 国产精品久久久久高潮| 欧美日韩在线免费视频| 丁香亚洲综合激情啪啪综合| 亚洲免费观看高清完整版在线观| sese一区| 国内性生活视频|