小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java垃圾回收總結(jié)(2)

 小豬窩969 2015-09-09

上一篇文章 介紹了jvm虛擬機(jī)運(yùn)行時(shí)內(nèi)存結(jié)構(gòu)以及如何標(biāo)識(shí)需要回收的對(duì)象,這一節(jié)主要講解垃圾回收的基本算法。


基本上 jvm內(nèi)存回收有三種 基本算法




  • 標(biāo)記-清除





標(biāo)記清除的算法最簡(jiǎn)單,主要是標(biāo)記出來(lái)需要回收的對(duì)象,然后然后把這些對(duì)象在內(nèi)存的信息清除。如何標(biāo)記需要回收的對(duì)象,在上一篇文章里面已經(jīng)有說(shuō)明。


2_1


 





  • 標(biāo)記-清除-壓縮





這個(gè)算法是在標(biāo)記-清除的算法之上進(jìn)行一下壓縮空間,重新移動(dòng)對(duì)象的過(guò)程。因?yàn)闃?biāo)記清除算法會(huì)導(dǎo)致很多的留下來(lái)的內(nèi)存空間碎片,隨著碎片的增多,嚴(yán)重影響內(nèi)存讀寫(xiě)的性能,所以在標(biāo)記-清除之后,會(huì)對(duì)內(nèi)存的碎片進(jìn)行整理。最簡(jiǎn)單的整理就是把對(duì)象壓縮到一邊,留出另一邊的空間。由于壓縮空間需要一定的時(shí)間,會(huì)影響垃圾收集的時(shí)間。


2_2


 





  • 標(biāo)記-清除-復(fù)制





這個(gè)算法是吧內(nèi)存分配為兩個(gè)空間,一個(gè)空間(A)用來(lái)負(fù)責(zé)裝載正常的對(duì)象信息,,另外一個(gè)內(nèi)存空間(B)是垃圾回收用的。每次把空間A中存活的對(duì)象全部復(fù)制到空間B里面,在一次性的把空間A刪除。這個(gè)算法在效率上比標(biāo)記-清除-壓縮高,但是需要兩塊空間,對(duì)內(nèi)存要求比較大,內(nèi)存的利用率比較低。適用于短生存期的對(duì)象,持續(xù)復(fù)制長(zhǎng)生存期的對(duì)象則導(dǎo)致效率降低




2_3 



 


由于現(xiàn)在的處理器都是多核的,處理器的性能得到了極大的提升,所以在此基礎(chǔ)上有產(chǎn)生了幾種垃圾收集算法。主要包括兩種算法



  • 并行標(biāo)記清除



所謂并行,就是原來(lái)垃圾回收只是一個(gè)線程進(jìn)行?,F(xiàn)在創(chuàng)建多個(gè)垃圾回收線程。并行的進(jìn)行標(biāo)記和清除。比如把需要標(biāo)記的對(duì)象平均分配到多個(gè)線程之后,當(dāng)標(biāo)記完成之后,多個(gè)線程進(jìn)行清除。


 




  • 并發(fā)標(biāo)記清除



所謂并發(fā),就是應(yīng)用程序和垃圾回收可以同時(shí)執(zhí)行。在標(biāo)記清除算法中,在標(biāo)記對(duì)象和清除對(duì)象,以及壓縮對(duì)象的情況下是需要暫停應(yīng)用的。那么并行標(biāo)記清除壓縮算法則是在標(biāo)記清除壓縮算法的基礎(chǔ)上,把標(biāo)記清除壓縮算法分為以下幾個(gè)過(guò)程


初始標(biāo)記->并發(fā)標(biāo)記->重新標(biāo)記->并發(fā)清除->重置



 


以上幾種算法是垃圾回收的基本算法,jvm垃圾回收就是在以上幾種算法為基礎(chǔ)的,在以上幾種算法的基礎(chǔ)上,java垃圾回收器可以分為以下幾種:



  • 串行收集器



用單線程處理所有垃圾回收工作,因?yàn)闊o(wú)需多線程交互,所以效率比較高。但是,也無(wú)法使用多處理器的優(yōu)勢(shì),所以此收集器適合單處理器機(jī)器




單線程收集器。在目前多核服務(wù)器端運(yùn)行的情況下,效率比較低。比較適合堆內(nèi)存小的情況下使用。




2_5




  • 并行收集器



用多線程處理所有垃圾回收工作,利用多核處理器的優(yōu)勢(shì)。但是如果線程數(shù)量過(guò)多,導(dǎo)致線程之間頻繁調(diào)度,也會(huì)影響性能。一半并行收集的線程是處理器的個(gè)數(shù)。




“對(duì)吞吐量有高要求”,多CPU、對(duì)應(yīng)用響應(yīng)時(shí)間無(wú)要求的中、大型應(yīng)用。舉例:后臺(tái)處理、科學(xué)計(jì)算。


2_6




  • 并發(fā)收集器



并發(fā)收集器主要減少年老代的暫停時(shí)間,他在應(yīng)用不停止的情況下使用獨(dú)立的垃圾回收線程,跟蹤可達(dá)對(duì)象。在每個(gè)年老代垃圾回收周期中,在收集初期并發(fā)收集器 會(huì)對(duì)整個(gè)應(yīng)用進(jìn)行簡(jiǎn)短的暫停(初始標(biāo)記的過(guò)程),在收集中還會(huì)再暫停一次。第二次暫停會(huì)比第一次稍長(zhǎng)(重新標(biāo)記的過(guò)程),在此過(guò)程中多個(gè)線程同時(shí)進(jìn)行垃圾回收工作。




并發(fā)收集器使用處理器換來(lái)短暫的停頓時(shí)間。在一個(gè)N個(gè)處理器的系統(tǒng)上,并發(fā)收集部分使用K/N個(gè)可用處理器進(jìn)行回收,一般情況下1<=K<=N/4。


在只有一個(gè)處理器的主機(jī)上使用并發(fā)收集器,設(shè)置為incremental mode模式也可獲得較短的停頓時(shí)間。


浮動(dòng)垃圾:由于在應(yīng)用運(yùn)行的同時(shí)進(jìn)行垃圾回收,所以有些垃圾可能在垃圾回收進(jìn)行完成時(shí)產(chǎn)生,這樣就造成了“Floating Garbage”,這些垃圾需要在下次垃圾回收周期時(shí)才能回收掉。所以,并發(fā)收集器一般需要20%的預(yù)留空間用于這些浮動(dòng)垃圾。


Concurrent Mode Failure:并發(fā)收集器在應(yīng)用運(yùn)行時(shí)進(jìn)行收集,所以需要保證堆在垃圾回收的這段時(shí)間有足夠的空間供程序使用,否則,垃圾回收還未完成,堆空間先滿了。這種情況下將會(huì)發(fā)生“并發(fā)模式失敗”,此時(shí)整個(gè)應(yīng)用將會(huì)暫停,進(jìn)行垃圾回收。




并發(fā)收集器,在垃圾回收的時(shí)候采用并發(fā)標(biāo)記清除算法的收集器


對(duì)響應(yīng)時(shí)間要求高的,多CPU,大型應(yīng)用。比如頁(yè)面請(qǐng)求/web服務(wù)器。前端業(yè)務(wù)系統(tǒng)用的比較多。


2_7



 


我們以sun公司的hotspot虛擬機(jī)為例,hotspot采用的是分代回收算法,因?yàn)楦鶕?jù)經(jīng)驗(yàn),一般80%的對(duì)象就是朝生夕滅,對(duì)象的生命期都很短。而根據(jù)對(duì)象的生命周期不同,可以劃分出來(lái)幾個(gè)區(qū)域,一部分區(qū)域的對(duì)象創(chuàng)建比較頻繁,但是生命周期比較短,一部分區(qū)域?qū)ο笊芷诒容^長(zhǎng),還有一部分區(qū)域?qū)ο笊芷趲缀鹾蚸ava虛擬機(jī)相同。


sunspot堆內(nèi)存分為三個(gè)區(qū)域:


2_4



  • 新生代(Young)



新生代包括兩個(gè)區(qū):Eden區(qū)和Survivor區(qū),其中Survivor區(qū)一般也分成兩塊,簡(jiǎn)稱Survivor1 Space 和 Survivor2 Space (或者From Space 和 To Space)。新生代通常存活時(shí)間較短,因此基于標(biāo)記清除復(fù)制算法來(lái)進(jìn)行回收,掃描出存活的對(duì)象,并復(fù)制到一塊新的完全未使用的空間中,對(duì)應(yīng)于新生代,就是在Eden和From或To之間copy。新生代采用空閑指針的方式來(lái)控制GC觸發(fā),指針保持最后一個(gè)分配的對(duì)象在新生代區(qū)間的位置,當(dāng)有新的對(duì)象要分配內(nèi)存時(shí),用于檢查空間是否足夠,不夠就觸發(fā)GC。當(dāng)連續(xù)分配對(duì)象時(shí),對(duì)象會(huì)逐漸從eden到Survior,最后到舊生代。




可以采用串行處理和并行處理器




  • 老年代(Old)



在垃圾回收多次,如果對(duì)象仍然存活,并且新生代的空間不夠,則對(duì)象會(huì)存放在老年代。


在老年代采用的是 標(biāo)記清除壓縮算法。因?yàn)槔夏甏膶?duì)象一般存活時(shí)間比較長(zhǎng),每次標(biāo)記清除之后,會(huì)有很多的零碎空間,這個(gè)就是所謂的浮動(dòng)垃圾。當(dāng)老年代的零碎空間不足以分配一個(gè)大的對(duì)象的時(shí)候,就會(huì)采用壓縮算法。在壓縮的時(shí)候,應(yīng)用需要暫停。


可以采用串行處理,并行處理器,以及并發(fā)處理器。




  • 持久代(Permanent)



這部分空間主要存放java方法區(qū)的數(shù)據(jù)以及啟動(dòng)類(lèi)加載器加載的對(duì)象。這一部分對(duì)象通常不會(huì)被回收。所以持久代空間在默認(rèn)的情況下是不會(huì)被垃圾回收的。


 



由于把內(nèi)存空間分為三塊,一般把新生代的GC稱為minor GC ,把老年代的GC成為 full GC,所謂full gc 會(huì)先出發(fā)一次minor gc,然后在進(jìn)行老年代的GC。


具體的過(guò)程如下:


首先想eden區(qū)申請(qǐng)分配空間,如果空間夠,就直接進(jìn)行分配,否則進(jìn)行一次Minor GC。minor GC 首先會(huì)對(duì)Eden區(qū)的對(duì)象進(jìn)行標(biāo)記,標(biāo)記出來(lái)存活的對(duì)象。然后把存活的對(duì)象copy到From空間。如果From空間足夠,則回收eden區(qū)可回收的對(duì)象。如果from內(nèi)存空間不夠,則把From空間存活的對(duì)象復(fù)制到To區(qū),如果TO區(qū)的內(nèi)存空間也不夠的話,則把To區(qū)存活的對(duì)象復(fù)制到老年代。如果老年代空間也不夠(或者達(dá)到觸發(fā)老年年垃圾回收條件的話)則觸發(fā)一次full GC。


簡(jiǎn)單方向就是Eden->From->To->Old,如下圖所示。


2_8

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多