乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       小豬窩969 2015-09-09

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


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




      • 標(biāo)記-清除





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


      2_1


       





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





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


      2_2


       





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





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




      2_3 



       


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



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



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


       




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



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


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



       


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



      • 串行收集器



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




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




      2_5




      • 并行收集器



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




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


      2_6




      • 并發(fā)收集器



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




      并發(fā)收集器使用處理器換來短暫的停頓時(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)記清除算法的收集器


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


      2_7



       


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


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


      2_4



      • 新生代(Young)



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




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




      • 老年代(Old)



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


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


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




      • 持久代(Permanent)



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


       



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


      具體的過程如下:


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


      簡單方向就是Eden->From->To->Old,如下圖所示。


      2_8

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多