全面解析Java的垃圾回收機制_第1頁
免費預覽已結(jié)束,剩余5頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、全面解析java的垃圾回收機制java的堆是一個運行時數(shù)據(jù)區(qū),類的實例(對象)從中分配空間。java虛擬機(jvm)的堆中儲存著正在運行的應(yīng)用程序所建立的全部對象,這些對象通過new、newarray、anewarray和multianewarray等命令建立,但是它們不需要程序代碼來顯式地釋放。普通來說,堆的是由垃圾回收來負責的,盡管jvm規(guī)范并不要求特別的垃圾回收技術(shù),甚至根本就不需要垃圾回收,但是因為內(nèi)存的有限性,jvm在實現(xiàn)的時候都有一個由垃圾回收所管理的堆。垃圾回收是一種動態(tài)存儲管理技術(shù),它自動地釋放不再被程序引用的對象,根據(jù)特定的垃圾收集算法來實現(xiàn)資源自動回收的功能。 垃圾收集的意

2、義 在c+中,對象所占的內(nèi)存在程序結(jié)束運行之前向來被占用,在明確釋放之前不能分配給其它對象;而在java中,當沒有對象引用指向原先分配給某個對象的內(nèi)存時,該內(nèi)存便成為垃圾。jvm的一個系統(tǒng)級線程會自動釋放該內(nèi)存塊。垃圾收集意味著程序不再需要的對象是無用信息,這些信息將被丟棄。當一個對象不再被引用的時候,內(nèi)存回收它占據(jù)的空間,以便空間被后來的新對象用法。實際上,除了釋放沒用的對象,垃圾收集也可以清除內(nèi)存記錄碎片。因為創(chuàng)建對象和垃圾收集器釋放丟棄對象所占的內(nèi)存空間,內(nèi)存會浮現(xiàn)碎片。碎片是分配給對象的內(nèi)存塊之間的空閑內(nèi)存洞。碎片收拾將所占用的堆內(nèi)存移到堆的一端,jvm將收拾出的內(nèi)存分配給新的對象。

3、垃圾收集能自動釋放內(nèi)存空間,減輕編程的負擔。這使java 虛擬機具有一些優(yōu)點。首先,它能使編程效率提高。在沒有垃圾收集機制的時候,可能要花許多時光來解決一個難懂的存儲器問題。在用java語言編程的時候,靠垃圾收集機制可大大縮短時光。第二是它庇護程序的完整性, 垃圾收集是java語言平安性策略的一個重要部份。 垃圾收集的一個潛在的缺點是它的開銷影響程序性能。java虛擬機必需追蹤運行程序中實用的對象, 而且終于釋放沒用的對象。這一個過程需要花費處理器的時光。第二垃圾收集算法的不完備性,早先采納的某些垃圾收集算法就不能保證100%收集到全部的廢棄內(nèi)存。固然隨著垃圾收集算法的不斷改進以及軟硬件運行效

4、率的不斷提升,這些問題都可以迎刃而解。 垃圾收集的算法分析 java語言規(guī)范沒有明確地解釋jvm用法哪種垃圾回收算法,但是任何一種垃圾收集算法普通要做2件基本的事情:(1)發(fā)覺無用信息對象;(2)回收被無用對象占用的內(nèi)存空間,使該空間可被程序再次用法。 大多數(shù)垃圾回收算法用法了根集(root )這個概念;所謂根集就量正在執(zhí)行的java程序可以拜訪的引用變量的集合(包括局部變量、參數(shù)、類變量),程序可以用法引用變量拜訪對象的屬性和調(diào)用對象的辦法。垃圾收集首選需要確定從根開頭哪些是可達的和哪些是不行達的,從根集可達的對象都是活動對象,它們不能作為垃圾被回收,這也包括從根集間接可達的對象。而根集通過

5、隨意路徑不行達的對象符合垃圾收集的條件,應(yīng)當被回收。下面介紹幾個常用的算法。 1、 引用計數(shù)法(referee counting collector) 引用計數(shù)法是唯一沒有用法根集的垃圾回收的法,該算法用法引用計數(shù)器來區(qū)別存活對象和不再用法的對象。普通來說,堆中的每個對象對應(yīng)一個引用計數(shù)器。當每一次創(chuàng)建一個對象并賦給一個變量時,引用計數(shù)器置為1。當對象被賦給隨意變量時,引用計數(shù)器每次加1當對象出了作用域后(該對象丟棄不再用法),引用計數(shù)器減1,一旦引用計數(shù)器為0,對象就滿足了垃圾收集的條件。 基于引用計數(shù)器的垃圾收集器運行較快,不會長時光中斷程序執(zhí)行,相宜地必需 實時運行的程序。但引用計數(shù)器增

6、強了程序執(zhí)行的開銷,由于每次對象賦給新的變量,計數(shù)器加1,而每次現(xiàn)有對象出了作用域生,計數(shù)器減1。 2、acing算法(tracing collector) tracing算法是為了解決引用計數(shù)法的問題而提出,它用法了根集的概念。基于tracing算法的垃圾收集器從根集開頭掃描,識別出哪些對象可達,哪些對象不行達,并用某種方式標志可達對象,例如對每個可達對象設(shè)置一個或多個位。在掃描識別過程中,基于tracing算法的垃圾收集也稱為標志和清除(mark-and-sweep)垃圾收集器。 3、compacting算法(compacting collector) 為了解決堆碎片問題,基于tracin

7、g的垃圾回收汲取了compacting算法的思想,在清除的過程中,算法將全部的對象移到堆的一端,堆的另一端就變成了一個相鄰的空閑內(nèi)存區(qū),收集器會對它移動的全部對象的全部引用舉行更新,使得這些引用在新的位置能識別本來 的對象。在基于compacting算法的收集器的實現(xiàn)中,普通增強句柄和句柄表。 4、copying算法(co collector) 該算法的提出是為了克服句柄的開銷和解決堆碎片的垃圾回收。它開頭時把堆分成 一個對象 面和多個空閑面, 程序從對象面為對象分配空間,當對象滿了,基于coping算法的垃圾 收集就從根集中掃描活動對象,并將每個 活動對象復制到空閑面(使得活動對象所占的內(nèi)存

8、之間沒有空閑洞),這樣空閑面變成了對象面,本來的對象面變成了空閑面,程序會在新的對象面中分配內(nèi)存。 一種典型的基于coping算法的垃圾回收是stop-and-copy算法,它將堆分成對象面和空閑區(qū)域面,在對象面與空閑區(qū)域面的切換過程中,程序暫停執(zhí)行。 5、generation算法(generational collector) stop-and-copy垃圾收集器的一個缺陷是收集器必需復制全部的活動對象,這增強了程序等待時光,這是coping算法低效的緣由。在程序設(shè)計中有這樣的邏輯:多數(shù)對象存在的時光比較短,少數(shù)的存在時光比較長。因此,generation算法將堆分成兩個或多個,每個子堆作為

9、對象的一代(generation)。因為多數(shù)對象存在的時光比較短,隨著程序丟棄不用法的對象,垃圾收集器將從最衰老的子堆中收集這些對象。在分代式的垃圾收集器運行后,上次運行存活下來的對象移到下一最高代的子堆中,因為老一代的子堆不會常常被回收,因而節(jié)約了時光。 6、adaptive算法(adaptive collector) 在特定的狀況下,一些垃圾收集算法會優(yōu)于其它算法?;赼daptive算法的垃圾收集器就是監(jiān)控當前堆的用法狀況,并將挑選適當算法的垃圾收集器。 透視java垃圾回收 1、行參數(shù)透視垃圾收集器的運行 2、用法system.gc()可以不管jvm用法的是哪一種垃圾回收的算法,都可以

10、哀求java的垃圾回收。 在指令行中有一個參數(shù)-verbosegc可以查看java用法的堆內(nèi)存的狀況,它的格式如下: java -verbosegc class 可以看個例子: class testgc public ic vo main(string args) new testgc(); system.gc(); system.runfinalization(); 在這個例子中,一個新的對象被創(chuàng)建,因為它沒有用法,所以該對象快速地變?yōu)榭蛇_,程序編譯后,執(zhí)行指令: java -verbosegc testgc 后結(jié)果為: full gc 168k- 97k(1984k), 0.0253873

11、 secs 機器的環(huán)境為,windows 2000 + jdk1.3.1,箭頭前后的數(shù)據(jù)168k和97k分離表示垃圾收集gc前后全部存活對象用法的內(nèi)存容量,解釋有168k-97k=71k的對象容量被回收,括號內(nèi)的數(shù)據(jù)1984k為堆內(nèi)存的總?cè)萘?,收集所需要的時光是0.0253873秒(這個時光在每次執(zhí)行的時候會有所不同)。 2、finalize辦法透視垃圾收集器的運行 在jvm垃圾收集器收集一個對象之前 ,普通要求程序調(diào)用適當?shù)霓k法釋放資源,但在沒有明確釋放資源的狀況下,java提供了缺省機制來終止化該對象心釋放資源,這個辦法就是finalize()。它的原型為: protect void fi

12、nalize() throws throwable 在finalize()辦法返回之后,對象消逝,垃圾收集開頭執(zhí)行。原型中的throws throwable表示它可以拋出任何類型的異樣。 之所以要用法finalize(),是因為有時需要實行與java的一般辦法不同的一種辦法,通過分配內(nèi)存來做一些具有c風格的事情。這主要可以通過固有辦法來舉行,它是從java里調(diào)用非java辦法的一種方式。c和c+是目前唯一獲得固有辦法支持的語言。但因為它們能調(diào)用通過其他語言編寫的子程序,所以能夠有效地調(diào)用任何東西。在非java代碼內(nèi)部,大概能調(diào)用c的malloc()系列函數(shù),用它分配存儲空間。而且除非調(diào)用了()

13、,否則存儲空間不會得到釋放,從而造成內(nèi)存漏洞的浮現(xiàn)。固然,free()是一個c和c+函數(shù),所以我們需要在finalize()內(nèi)部的一個固有辦法中調(diào)用它。也就是說我們不能過多地用法finalize(),它并不是舉行一般清除工作的抱負場所。 在一般的清除工作中,為清除一個對象,那個對象的用戶必需在希翼舉行清除的地點調(diào)用一個清除辦法。這與c+破壞器的概念稍有抵觸。在c+中,全部對象都會破壞(清除)?;蛘邠Q句話說,全部對象都應(yīng)當破壞。若將c+對象創(chuàng)建成一個本地對象,比如在堆棧中創(chuàng)建(在java中是不行能的),那么清除或破壞工作就會在結(jié)束花括號所代表的、創(chuàng)建這個對象的作用域的末尾舉行。若對象是用new創(chuàng)

14、建的(類似于java),那么當程序員調(diào)用c+的delete指令時(java沒有這個指令),就會調(diào)用相應(yīng)的破壞器。若程序員遺忘了,那么永久不會調(diào)用破壞器,我們終于得到的將是一個內(nèi)存漏洞,另外還包括對象的其他部分永久不會得到清除。 相反,java不允許我們創(chuàng)建本地(局部)對象-無論如何都要用法new。但在java中,沒有delete指令來釋放對象,由于垃圾收集器會協(xié)助我們自動釋放存儲空間。所以假如站在比較簡化的立場,我們可以說正是因為存在垃圾收集機制,所以java沒有破壞器。然而,隨著以后學習的深化,就會知道垃圾收集器的存在并不能徹低消退對破壞器的需要,或者說不能消退對破壞器代表的那種機制的需要(

15、而且肯定不能挺直調(diào)用finalize(),所以應(yīng)盡量避開用它)。若希翼執(zhí)行除釋放存儲空間之外的其他某種形式的清除工作,仍然必需調(diào)用java中的一個辦法。它等價于c+的破壞器,只是沒后者便利。 下面這個例子向大家展示了垃圾收集所經(jīng)受的過程,并對前面的陳述舉行了總結(jié)。 class chair static boolean gcrun = fae; static boolean f = false; static int created = 0; static int finalized = 0; int i; chair() i = +created; if(created = 47) syste

16、m.out.print(created 47); 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) sy

17、stem.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 beforen 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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論