狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

垃圾收集(轉)

垃圾收集(轉)

更新時間:2024-04-12 文章作者:未知 信息來源:網絡 閱讀次數:

《垃圾收集》
--------------------------------------------------------------------------------

垃圾收集器是Java語言區別于其他程序設計語言的一大特色。它把程序員從手工回收內存空間的繁重工作中解脫了出來。在SUN公司的Java程序員(Java Programmer)認證考試中,垃圾收集器是必考的內容,一般最多可以占總分值的6%左右。但是由于SUN公司的Java Programming Language SL-275課程的標準教材中,對有關垃圾收集器的內容只做了非常簡單的介紹,而另外的一些關于Java技術的書籍,比如《Java 2核心技術》、《Java編程思想》、《精通Java 2》等等,里面關于垃圾收集器的內容也幾乎沒有,或者只是簡單地提兩句,所以很多參加Java Programmer認證考試的中國考生,在垃圾收集器這一部分的得分都為0分。鑒于此,筆者總結了這個垃圾收集器的專題,希望對廣大Java技術的愛好者和準備認證考試的考生們有所幫助。
我們知道,許多程序設計語言都允許在程序運行期動態地分配內存空間。分配內存的方式多種多樣,取決于該種語言的語法結構。但不論是哪一種語言的內存分配方式,最后都要返回所分配的內存塊的起始地址,即返回一個指針到內存塊的首地址。當已經分配的內存空間不再需要時,換句話說當指向該內存塊的句柄超出了使用范圍的時候,該程序或其運行環境就應該回收該內存空間,以節省寶貴的內存資源。在C,C++或其他程序設計語言中,無論是對象還是動態配置的資源或內存,都必須由程序員自行聲明產生和回收,否則其中的資源將消耗,造成資源的浪費甚至死機。但手工回收內存往往是一項復雜而艱巨的工作。因為要預先確定占用的內存空間是否應該被回收是非常困難的!如果一段程序不能回收內存空間,而且在程序運行時系統中又沒有了可以分配的內存空間時,這段程序就只能崩潰。通常,我們把分配出去后,卻無法回收的內存空間稱為"內存滲漏體(Memory Leaks)"。
以上這種程序設計的潛在危險性在Java這樣以嚴謹、安全著稱的語言中是不允許的。但是Java語言既不能限制程序員編寫程序的自由性,又不能把聲明對象的部分去除(否則就不是面向對象的程序語言了),那么最好的解決辦法就是從Java程序語言本身的特性入手。于是,Java技術提供了一個系統級的線程(Thread),即垃圾收集器線程(Garbage Collection Thread),來跟蹤每一塊分配出去的內存空間,當Java虛擬機(JVM)處于空閑循環時,垃圾收集器線程會自動檢查每一快分配出去的內存空間,然后自動回收每一塊可以回收的無用的內存塊。
垃圾收集器線程是一種低優先級的線程,在一個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值。這種類型的題在認證考試中是最簡單的。
程序段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、給對象賦予了空值null,以下再沒有調用過。
2、給對象賦予了新值,既重新分配了內存空間。
最后再次提醒一下,一塊內存空間符合了垃圾收集器的收集標準,并不意味著這塊內存空間就一定會被垃圾收集器收集。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
国产精品午夜免费| 久久精品无码一区二区三区| 成人黄色av电影| 亚洲欧洲一区二区三区| 欧美在线视频全部完| 青青草原综合久久大伊人精品优势| 欧美在线免费播放| 美女视频网站久久| 国产网红主播福利一区二区| 国产精品老牛| 日韩理论片在线| 91麻豆精品国产91久久久久久| 欧美午夜一区二区福利视频| 美女性感视频久久| 一区二区中文字幕在线| 欧美二区三区的天堂| 在线视频欧美一区| 黄一区二区三区| 精品国产精品网麻豆系列| 亚洲欧美日韩专区| 成人免费看视频| 日韩vs国产vs欧美| 一区视频在线播放| 日韩欧美成人午夜| 色偷偷成人一区二区三区91| 欧美福利视频| 国产精品一区免费在线观看| 亚洲一区二区三区午夜| 成人综合在线网站| 免费看黄色91| 一区二区三区欧美激情| 久久久精品国产免费观看同学| 欧美日韩精品久久久| 1024亚洲| av一区二区三区四区| 捆绑变态av一区二区三区| 亚洲欧美另类在线| 久久久久久免费网| 日韩一区二区三区电影在线观看| 色偷偷久久人人79超碰人人澡| 国产精品视频线看| 精品成人在线观看| 国产高清无密码一区二区三区| 国产日产高清欧美一区二区三区| 国产精品久久久久永久免费观看 | 亚洲成a人片在线观看中文| 国产亚洲一区二区三区| 日韩欧美中文字幕一区| 欧美亚洲一区二区在线观看| 香蕉成人久久| 日韩视频在线一区二区三区| 欧美大片一区| 97超碰欧美中文字幕| 懂色av一区二区三区蜜臀| 九九**精品视频免费播放| 五月综合激情日本mⅴ| 亚洲自拍另类综合| 亚洲免费电影在线| 亚洲视频在线观看一区| 国产精品蜜臀在线观看| 国产欧美一区二区三区鸳鸯浴| 日韩欧美一级特黄在线播放| 欧美精品乱人伦久久久久久| 欧美男男青年gay1069videost| 在线免费观看不卡av| 91久久奴性调教| 久久精品99| 久久免费黄色| 久久精品日产第一区二区三区| 久久av最新网址| 国产麻豆日韩| 久久国产直播| 欧美体内she精高潮| 欧美日韩一级二级| 欧美日韩激情一区二区三区| 欧美美女激情18p| 91精品午夜视频| 日韩美一区二区三区| 精品国产乱码久久久久久牛牛| 精品国免费一区二区三区| 久久久一区二区三区捆绑**| 久久九九影视网| 久久久精品免费观看| 国产精品国模大尺度视频| 中文字幕精品一区二区三区精品| 国产精品理论片在线观看| 国产女主播在线一区二区| 中文字幕在线观看一区| 一区二区三区在线影院| 午夜精品久久久久| 久久超碰97中文字幕| 国产精品66部| 91亚洲大成网污www| 色综合天天综合网天天狠天天 | 久久在线91| 欧美日精品一区视频| 日韩一卡二卡三卡| 国产亚洲欧美日韩日本| 亚洲嫩草精品久久| 亚洲成精国产精品女| 狂野欧美性猛交blacked| 成人夜色视频网站在线观看| a美女胸又www黄视频久久| 你懂的成人av| 亚洲国产裸拍裸体视频在线观看乱了中文| 一区二区动漫| 91福利在线导航| 国产一区日韩欧美| 国内精品久久久久影院一蜜桃| 国产精品久久三区| 亚洲一区二区伦理| 成人福利在线看| 自拍av一区二区三区| 在线日韩一区二区| 成人精品小蝌蚪| 五月综合激情网| 亚洲高清免费| 蜜臀久久久99精品久久久久久| 美女精品自拍一二三四| 亚洲欧美区自拍先锋| 免费成人你懂的| 99久久精品国产一区| 亚洲精品一区二区三| 久久美女性网| 精品国产乱码久久| 亚洲成av人片在线观看无码| 国产精品综合一区二区三区| 国内精品嫩模av私拍在线观看| 老牛国产精品一区的观看方式| 日韩欧美中文字幕公布| 亚洲黄一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 亚洲午夜伦理| 欧美人体做爰大胆视频| 久久综合成人精品亚洲另类欧美 | 亚洲另类春色校园小说| 精品一区二区三区在线观看国产| 欧美激情第8页| 榴莲视频成人在线观看| 欧美v国产在线一区二区三区| 一区二区视频在线看| 国产99久久精品| 国产农村妇女毛片精品久久莱园子 | 亚洲国产日韩av| 成人动漫视频在线| 噜噜爱69成人精品| 久久久蜜桃精品| 日韩一区精品视频| 欧美成人一区二免费视频软件| 日本韩国欧美国产| 国产精品免费aⅴ片在线观看| 国模冰冰炮一区二区| 日韩视频三区| 久久综合九色综合97婷婷| 欧美性大战久久久久久久蜜臀 | 国产自产在线视频一区| 国产欧美不卡| 国产精品美女久久久久aⅴ国产馆| 久久精品噜噜噜成人88aⅴ | 日韩一区欧美二区| 国产一区日韩一区| 日韩三级免费观看| 亚洲乱码中文字幕| 久久精品国产第一区二区三区| 国产二区国产一区在线观看| 欧美日韩国产免费观看| 亚洲午夜一区二区三区| 国产成人亚洲综合a∨婷婷| 国产精品久久久久久久免费软件| 亚洲精品一区二区精华| 久久99精品视频| 久久国产精品久久久久久电车| 国产精品伦理在线| av在线播放不卡| 欧美一区二区观看视频| 毛片一区二区三区| 国产女主播一区二区| 1024亚洲合集| 成人黄色在线视频| 欧美网站大全在线观看| 欧美主播一区二区三区| 一区二区三区日韩| 黄色成人在线网站| 久久精品一区二区三区不卡牛牛| 国产麻豆一精品一av一免费| 一本大道久久a久久精二百| 亚洲精品日韩综合观看成人91| 欧美bbbxxxxx| 精品sm捆绑视频| 国产精品 欧美精品| 欧美欧美欧美欧美| 久久99国产精品免费| 91成人网在线| 首页综合国产亚洲丝袜| 久久不射中文字幕| 一区二区三区丝袜| 一区二区亚洲| 亚洲欧洲精品一区二区三区| 欧美日韩爆操|