
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、全面解析java的垃圾回收機(jī)制java的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的實(shí)例(對(duì)象)從中分配空間。java虛擬機(jī)(jvm)的堆中儲(chǔ)存著正在運(yùn)行的應(yīng)用程序所建立的全部對(duì)象,這些對(duì)象通過new、newarray、anewarray和multianewarray等命令建立,但是它們不需要程序代碼來顯式地釋放。普通來說,堆的是由垃圾回收來負(fù)責(zé)的,盡管jvm規(guī)范并不要求特別的垃圾回收技術(shù),甚至根本就不需要垃圾回收,但是因?yàn)閮?nèi)存的有限性,jvm在實(shí)現(xiàn)的時(shí)候都有一個(gè)由垃圾回收所管理的堆。垃圾回收是一種動(dòng)態(tài)存儲(chǔ)管理技術(shù),它自動(dòng)地釋放不再被程序引用的對(duì)象,根據(jù)特定的垃圾收集算法來實(shí)現(xiàn)資源自動(dòng)回收的功能。 垃圾收集的意
2、義 在c+中,對(duì)象所占的內(nèi)存在程序結(jié)束運(yùn)行之前向來被占用,在明確釋放之前不能分配給其它對(duì)象;而在java中,當(dāng)沒有對(duì)象引用指向原先分配給某個(gè)對(duì)象的內(nèi)存時(shí),該內(nèi)存便成為垃圾。jvm的一個(gè)系統(tǒng)級(jí)線程會(huì)自動(dòng)釋放該內(nèi)存塊。垃圾收集意味著程序不再需要的對(duì)象是無用信息,這些信息將被丟棄。當(dāng)一個(gè)對(duì)象不再被引用的時(shí)候,內(nèi)存回收它占據(jù)的空間,以便空間被后來的新對(duì)象用法。實(shí)際上,除了釋放沒用的對(duì)象,垃圾收集也可以清除內(nèi)存記錄碎片。因?yàn)閯?chuàng)建對(duì)象和垃圾收集器釋放丟棄對(duì)象所占的內(nèi)存空間,內(nèi)存會(huì)浮現(xiàn)碎片。碎片是分配給對(duì)象的內(nèi)存塊之間的空閑內(nèi)存洞。碎片收拾將所占用的堆內(nèi)存移到堆的一端,jvm將收拾出的內(nèi)存分配給新的對(duì)象。
3、垃圾收集能自動(dòng)釋放內(nèi)存空間,減輕編程的負(fù)擔(dān)。這使java 虛擬機(jī)具有一些優(yōu)點(diǎn)。首先,它能使編程效率提高。在沒有垃圾收集機(jī)制的時(shí)候,可能要花許多時(shí)光來解決一個(gè)難懂的存儲(chǔ)器問題。在用java語言編程的時(shí)候,靠垃圾收集機(jī)制可大大縮短時(shí)光。第二是它庇護(hù)程序的完整性, 垃圾收集是java語言平安性策略的一個(gè)重要部份。 垃圾收集的一個(gè)潛在的缺點(diǎn)是它的開銷影響程序性能。java虛擬機(jī)必需追蹤運(yùn)行程序中實(shí)用的對(duì)象, 而且終于釋放沒用的對(duì)象。這一個(gè)過程需要花費(fèi)處理器的時(shí)光。第二垃圾收集算法的不完備性,早先采納的某些垃圾收集算法就不能保證100%收集到全部的廢棄內(nèi)存。固然隨著垃圾收集算法的不斷改進(jìn)以及軟硬件運(yùn)行效
4、率的不斷提升,這些問題都可以迎刃而解。 垃圾收集的算法分析 java語言規(guī)范沒有明確地解釋jvm用法哪種垃圾回收算法,但是任何一種垃圾收集算法普通要做2件基本的事情:(1)發(fā)覺無用信息對(duì)象;(2)回收被無用對(duì)象占用的內(nèi)存空間,使該空間可被程序再次用法。 大多數(shù)垃圾回收算法用法了根集(root )這個(gè)概念;所謂根集就量正在執(zhí)行的java程序可以拜訪的引用變量的集合(包括局部變量、參數(shù)、類變量),程序可以用法引用變量拜訪對(duì)象的屬性和調(diào)用對(duì)象的辦法。垃圾收集首選需要確定從根開頭哪些是可達(dá)的和哪些是不行達(dá)的,從根集可達(dá)的對(duì)象都是活動(dòng)對(duì)象,它們不能作為垃圾被回收,這也包括從根集間接可達(dá)的對(duì)象。而根集通過
5、隨意路徑不行達(dá)的對(duì)象符合垃圾收集的條件,應(yīng)當(dāng)被回收。下面介紹幾個(gè)常用的算法。 1、 引用計(jì)數(shù)法(referee counting collector) 引用計(jì)數(shù)法是唯一沒有用法根集的垃圾回收的法,該算法用法引用計(jì)數(shù)器來區(qū)別存活對(duì)象和不再用法的對(duì)象。普通來說,堆中的每個(gè)對(duì)象對(duì)應(yīng)一個(gè)引用計(jì)數(shù)器。當(dāng)每一次創(chuàng)建一個(gè)對(duì)象并賦給一個(gè)變量時(shí),引用計(jì)數(shù)器置為1。當(dāng)對(duì)象被賦給隨意變量時(shí),引用計(jì)數(shù)器每次加1當(dāng)對(duì)象出了作用域后(該對(duì)象丟棄不再用法),引用計(jì)數(shù)器減1,一旦引用計(jì)數(shù)器為0,對(duì)象就滿足了垃圾收集的條件。 基于引用計(jì)數(shù)器的垃圾收集器運(yùn)行較快,不會(huì)長(zhǎng)時(shí)光中斷程序執(zhí)行,相宜地必需 實(shí)時(shí)運(yùn)行的程序。但引用計(jì)數(shù)器增
6、強(qiáng)了程序執(zhí)行的開銷,由于每次對(duì)象賦給新的變量,計(jì)數(shù)器加1,而每次現(xiàn)有對(duì)象出了作用域生,計(jì)數(shù)器減1。 2、acing算法(tracing collector) tracing算法是為了解決引用計(jì)數(shù)法的問題而提出,它用法了根集的概念?;趖racing算法的垃圾收集器從根集開頭掃描,識(shí)別出哪些對(duì)象可達(dá),哪些對(duì)象不行達(dá),并用某種方式標(biāo)志可達(dá)對(duì)象,例如對(duì)每個(gè)可達(dá)對(duì)象設(shè)置一個(gè)或多個(gè)位。在掃描識(shí)別過程中,基于tracing算法的垃圾收集也稱為標(biāo)志和清除(mark-and-sweep)垃圾收集器。 3、compacting算法(compacting collector) 為了解決堆碎片問題,基于tracin
7、g的垃圾回收汲取了compacting算法的思想,在清除的過程中,算法將全部的對(duì)象移到堆的一端,堆的另一端就變成了一個(gè)相鄰的空閑內(nèi)存區(qū),收集器會(huì)對(duì)它移動(dòng)的全部對(duì)象的全部引用舉行更新,使得這些引用在新的位置能識(shí)別本來 的對(duì)象。在基于compacting算法的收集器的實(shí)現(xiàn)中,普通增強(qiáng)句柄和句柄表。 4、copying算法(co collector) 該算法的提出是為了克服句柄的開銷和解決堆碎片的垃圾回收。它開頭時(shí)把堆分成 一個(gè)對(duì)象 面和多個(gè)空閑面, 程序從對(duì)象面為對(duì)象分配空間,當(dāng)對(duì)象滿了,基于coping算法的垃圾 收集就從根集中掃描活動(dòng)對(duì)象,并將每個(gè) 活動(dòng)對(duì)象復(fù)制到空閑面(使得活動(dòng)對(duì)象所占的內(nèi)存
8、之間沒有空閑洞),這樣空閑面變成了對(duì)象面,本來的對(duì)象面變成了空閑面,程序會(huì)在新的對(duì)象面中分配內(nèi)存。 一種典型的基于coping算法的垃圾回收是stop-and-copy算法,它將堆分成對(duì)象面和空閑區(qū)域面,在對(duì)象面與空閑區(qū)域面的切換過程中,程序暫停執(zhí)行。 5、generation算法(generational collector) stop-and-copy垃圾收集器的一個(gè)缺陷是收集器必需復(fù)制全部的活動(dòng)對(duì)象,這增強(qiáng)了程序等待時(shí)光,這是coping算法低效的緣由。在程序設(shè)計(jì)中有這樣的邏輯:多數(shù)對(duì)象存在的時(shí)光比較短,少數(shù)的存在時(shí)光比較長(zhǎng)。因此,generation算法將堆分成兩個(gè)或多個(gè),每個(gè)子堆作為
9、對(duì)象的一代(generation)。因?yàn)槎鄶?shù)對(duì)象存在的時(shí)光比較短,隨著程序丟棄不用法的對(duì)象,垃圾收集器將從最衰老的子堆中收集這些對(duì)象。在分代式的垃圾收集器運(yùn)行后,上次運(yùn)行存活下來的對(duì)象移到下一最高代的子堆中,因?yàn)槔弦淮淖佣巡粫?huì)常常被回收,因而節(jié)約了時(shí)光。 6、adaptive算法(adaptive collector) 在特定的狀況下,一些垃圾收集算法會(huì)優(yōu)于其它算法?;赼daptive算法的垃圾收集器就是監(jiān)控當(dāng)前堆的用法狀況,并將挑選適當(dāng)算法的垃圾收集器。 透視java垃圾回收 1、行參數(shù)透視垃圾收集器的運(yùn)行 2、用法system.gc()可以不管jvm用法的是哪一種垃圾回收的算法,都可以
10、哀求java的垃圾回收。 在指令行中有一個(gè)參數(shù)-verbosegc可以查看java用法的堆內(nèi)存的狀況,它的格式如下: java -verbosegc class 可以看個(gè)例子: class testgc public ic vo main(string args) new testgc(); system.gc(); system.runfinalization(); 在這個(gè)例子中,一個(gè)新的對(duì)象被創(chuàng)建,因?yàn)樗鼪]有用法,所以該對(duì)象快速地變?yōu)榭蛇_(dá),程序編譯后,執(zhí)行指令: java -verbosegc testgc 后結(jié)果為: full gc 168k- 97k(1984k), 0.0253873
11、 secs 機(jī)器的環(huán)境為,windows 2000 + jdk1.3.1,箭頭前后的數(shù)據(jù)168k和97k分離表示垃圾收集gc前后全部存活對(duì)象用法的內(nèi)存容量,解釋有168k-97k=71k的對(duì)象容量被回收,括號(hào)內(nèi)的數(shù)據(jù)1984k為堆內(nèi)存的總?cè)萘?,收集所需要的時(shí)光是0.0253873秒(這個(gè)時(shí)光在每次執(zhí)行的時(shí)候會(huì)有所不同)。 2、finalize辦法透視垃圾收集器的運(yùn)行 在jvm垃圾收集器收集一個(gè)對(duì)象之前 ,普通要求程序調(diào)用適當(dāng)?shù)霓k法釋放資源,但在沒有明確釋放資源的狀況下,java提供了缺省機(jī)制來終止化該對(duì)象心釋放資源,這個(gè)辦法就是finalize()。它的原型為: protect void fi
12、nalize() throws throwable 在finalize()辦法返回之后,對(duì)象消逝,垃圾收集開頭執(zhí)行。原型中的throws throwable表示它可以拋出任何類型的異樣。 之所以要用法finalize(),是因?yàn)橛袝r(shí)需要實(shí)行與java的一般辦法不同的一種辦法,通過分配內(nèi)存來做一些具有c風(fēng)格的事情。這主要可以通過固有辦法來舉行,它是從java里調(diào)用非java辦法的一種方式。c和c+是目前唯一獲得固有辦法支持的語言。但因?yàn)樗鼈兡苷{(diào)用通過其他語言編寫的子程序,所以能夠有效地調(diào)用任何東西。在非java代碼內(nèi)部,大概能調(diào)用c的malloc()系列函數(shù),用它分配存儲(chǔ)空間。而且除非調(diào)用了()
13、,否則存儲(chǔ)空間不會(huì)得到釋放,從而造成內(nèi)存漏洞的浮現(xiàn)。固然,free()是一個(gè)c和c+函數(shù),所以我們需要在finalize()內(nèi)部的一個(gè)固有辦法中調(diào)用它。也就是說我們不能過多地用法finalize(),它并不是舉行一般清除工作的抱負(fù)場(chǎng)所。 在一般的清除工作中,為清除一個(gè)對(duì)象,那個(gè)對(duì)象的用戶必需在希翼舉行清除的地點(diǎn)調(diào)用一個(gè)清除辦法。這與c+破壞器的概念稍有抵觸。在c+中,全部對(duì)象都會(huì)破壞(清除)。或者換句話說,全部對(duì)象都應(yīng)當(dāng)破壞。若將c+對(duì)象創(chuàng)建成一個(gè)本地對(duì)象,比如在堆棧中創(chuàng)建(在java中是不行能的),那么清除或破壞工作就會(huì)在結(jié)束花括號(hào)所代表的、創(chuàng)建這個(gè)對(duì)象的作用域的末尾舉行。若對(duì)象是用new創(chuàng)
14、建的(類似于java),那么當(dāng)程序員調(diào)用c+的delete指令時(shí)(java沒有這個(gè)指令),就會(huì)調(diào)用相應(yīng)的破壞器。若程序員遺忘了,那么永久不會(huì)調(diào)用破壞器,我們終于得到的將是一個(gè)內(nèi)存漏洞,另外還包括對(duì)象的其他部分永久不會(huì)得到清除。 相反,java不允許我們創(chuàng)建本地(局部)對(duì)象-無論如何都要用法new。但在java中,沒有delete指令來釋放對(duì)象,由于垃圾收集器會(huì)協(xié)助我們自動(dòng)釋放存儲(chǔ)空間。所以假如站在比較簡(jiǎn)化的立場(chǎng),我們可以說正是因?yàn)榇嬖诶占瘷C(jī)制,所以java沒有破壞器。然而,隨著以后學(xué)習(xí)的深化,就會(huì)知道垃圾收集器的存在并不能徹低消退對(duì)破壞器的需要,或者說不能消退對(duì)破壞器代表的那種機(jī)制的需要(
15、而且肯定不能挺直調(diào)用finalize(),所以應(yīng)盡量避開用它)。若希翼執(zhí)行除釋放存儲(chǔ)空間之外的其他某種形式的清除工作,仍然必需調(diào)用java中的一個(gè)辦法。它等價(jià)于c+的破壞器,只是沒后者便利。 下面這個(gè)例子向大家展示了垃圾收集所經(jīng)受的過程,并對(duì)前面的陳述舉行了總結(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 卓越之旅模板
- 高考勝利之道
- 基于大數(shù)據(jù)的家校共育評(píng)估與反饋機(jī)制
- 農(nóng)村閑置資源的價(jià)值挖掘與轉(zhuǎn)化
- 提升初中數(shù)學(xué)解題
- 雙十二家居市場(chǎng)策略
- 中醫(yī)講解肝的奧秘
- 肺脹個(gè)案護(hù)理
- 針灸治療嘔吐的臨床應(yīng)用體系
- 單招試題特點(diǎn)及答案詳解
- 人工魚礁施工組織設(shè)計(jì)
- GB/T 5334-2021乘用車車輪彎曲和徑向疲勞性能要求及試驗(yàn)方法
- GB/T 4851-2014膠粘帶持粘性的試驗(yàn)方法
- GB/T 26480-2011閥門的檢驗(yàn)和試驗(yàn)
- GB/T 18838.2-2017涂覆涂料前鋼材表面處理噴射清理用金屬磨料的技術(shù)要求第2部分:冷硬鑄鐵砂
- GB/T 13917.9-2009農(nóng)藥登記用衛(wèi)生殺蟲劑室內(nèi)藥效試驗(yàn)及評(píng)價(jià)第9部分:驅(qū)避劑
- 闌尾腫瘤-課件
- openstack云計(jì)算平臺(tái)搭建課件
- 組合邏輯電路設(shè)計(jì)與實(shí)驗(yàn)報(bào)告
- 勞務(wù)實(shí)名制及農(nóng)民工工資支付管理考核試題及答案
- 2020人教部編版四年級(jí)下冊(cè)語文全冊(cè)單元知識(shí)要點(diǎn)考點(diǎn)匯編(期末總復(fù)習(xí)課件)
評(píng)論
0/150
提交評(píng)論