日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

JVM垃圾回收機(jī)制總結(jié)(3) :按代垃圾收集器

系統(tǒng) 1836 0

全文轉(zhuǎn)載: http://pengjiaheng.iteye.com/blog/524024

作者:和你在一起 [from JavaEye]

為什么要分代

?? ?分代的垃圾回收策略,是基于這樣一個事實(shí): 不同的對象的生命周期是不一樣的 因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。

?

?? ?在Java程序運(yùn)行的過程中,會產(chǎn)生大量的對象,其中有些對象是與業(yè)務(wù)信息相關(guān),比如Http請求中的Session對象、線程、Socket連接,這 類對象跟業(yè)務(wù)直接掛鉤,因此生命周期比較長。但是還有一些對象,主要是程序運(yùn)行過程中生成的臨時變量,這些對象生命周期會比較短,比如:String對 象,由于其不變類的特性,系統(tǒng)會產(chǎn)生大量的這些對象,有些對象甚至只用一次即可回收。

?

?? ?試想,在不進(jìn)行對象存活時間區(qū)分的情況下,每次垃圾回收都是對整個堆空間進(jìn)行回收,花費(fèi)時間相對會長,同時,因?yàn)槊看位厥斩夹枰闅v所有存活對象,但實(shí) 際上,對于生命周期長的對象而言,這種遍歷是沒有效果的,因?yàn)榭赡苓M(jìn)行了很多次遍歷,但是他們依舊存在。因此,分代垃圾回收采用分治的思想,進(jìn)行代的劃 分,把不同生命周期的對象放在不同代上,不同代上采用最適合它的垃圾回收方式進(jìn)行回收。

?

如何分代

如圖所示:

?

?? ?虛擬機(jī)中的共劃分為三個代: 年輕代(Young Generation)、年老點(diǎn)(Old Generation)和持久代(Permanent Generation) 其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關(guān)系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。

?

年輕代:

?? ?所有新生成的對象首先都是放在年輕代的。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區(qū)。一個Eden區(qū),兩個 Survivor區(qū)(一般而言)。大部分對象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時,還存活的對象將被復(fù)制到Survivor區(qū)(兩個中的一個),當(dāng)這個 Survivor區(qū)滿時,此區(qū)的存活對象將被復(fù)制到另外一個Survivor區(qū),當(dāng)這個Survivor去也滿了的時候,從第一個Survivor區(qū)復(fù)制 過來的并且此時還存活的對象,將被復(fù)制“年老區(qū)(Tenured)”。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系,所以同一個區(qū)中可能同時 存在從Eden復(fù)制過來 對象,和從前一個Survivor復(fù)制過來的對象,而復(fù)制到年老區(qū)的只有從第一個Survivor去過來的對象。而且,Survivor區(qū)總有一個是空 的。同時,根據(jù)程序需要,Survivor區(qū)是可以配置為多個的(多于兩個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。

?

年老代:

?? ?在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認(rèn)為年老代中存放的都是一些生命周期較長的對象。

?

持久代:

?? ?用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate 等,在這種時候需要設(shè)置一個比較大的持久代空間來存放這些運(yùn)行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進(jìn)行設(shè) 置。

?

什么情況下觸發(fā)垃圾回收

由于對象進(jìn)行了分代處理,因此垃圾回收區(qū)域、時間也不一樣。GC有兩種類型: Scavenge GC Full GC

?

Scavenge GC

?? ?? 一般情況下,當(dāng)新對象生成,并且在Eden申請空間失敗時,就會觸發(fā)Scavenge GC,對Eden區(qū)域進(jìn)行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區(qū)。然后整理Survivor的兩個區(qū)。這種方式的GC是對 年輕代的Eden區(qū)進(jìn)行,不會影響到年老代。因?yàn)榇蟛糠謱ο蠖际菑腅den區(qū)開始的,同時Eden區(qū)不會分配的很大,所以Eden區(qū)的GC會頻繁進(jìn)行。因 而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。

?

Full GC

????? 對整個堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC因?yàn)樾枰獙φ麄€對進(jìn)行回收,所以比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC的次數(shù)。在對JVM調(diào)優(yōu)的過程中,很大一部分工作就是對于FullGC的調(diào)節(jié)。有如下原因可能導(dǎo)致Full GC:

????? 年老代(Tenured)被寫滿

????? 持久代(Perm)被寫滿

?? ?? System.gc()被顯示調(diào)用

?? ? 上一次GC之后Heap的各域分配策略動態(tài)變化

?

?

分代垃圾回收流程示意

?

?

?

?

選擇合適的垃圾收集算法

垃圾回收機(jī)制也可以多線程的工作,那么也就出現(xiàn)了下面三種收集器:

?

串行收集器

?

用單線程處理所有垃圾回收工作,因?yàn)闊o需多線程交互,所以效率比較高。但是,也無法使用多處理器的優(yōu)勢,所以此收集器適合單處理器機(jī)器。當(dāng)然,此收集器也可以用在小數(shù)據(jù)量(100M左右)情況下的多處理器機(jī)器上。可以使用-XX:+UseSerialGC打開。

?

?

并行收集器

?

對年輕代進(jìn)行并行垃圾回收,因此可以減少垃圾回收時間。一般在多線程多處理器機(jī)器上使用。使用-XX:+UseParallelGC.打開。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中進(jìn)行了增強(qiáng)--可以對年老代進(jìn)行并行收集。如果年老代不使用并發(fā)收集的話,默認(rèn)是使用單線程進(jìn)行垃圾回收,因此會制約擴(kuò)展能力。使用-XX:+UseParallelOldGC打開。

使用-XX:ParallelGCThreads=<N>設(shè)置并行垃圾回收的線程數(shù)。此值可以設(shè)置與機(jī)器處理器數(shù)量相等。

此收集器可以進(jìn)行如下配置:

最大垃圾回收暫停: 指定垃圾回收時的最長暫停時間,通過-XX:MaxGCPauseMillis=<N>指定。<N>為毫秒.如果指定了此值的話,堆大小和垃圾回收相關(guān)參數(shù)會進(jìn)行調(diào)整以達(dá)到指定值。設(shè)定此值可能會減少應(yīng)用的吞吐量。

吞吐量: 吞吐量為垃圾回收時間與非垃圾回收時間的比值,通過-XX:GCTimeRatio=<N>來設(shè)定,公式為1/(1+N)。例如,-XX:GCTimeRatio=19時,表示5%的時間用于垃圾回收。默認(rèn)情況為99,即1%的時間用于垃圾回收。

?

?

?

并發(fā)收集器

可以保證大部分工作都并發(fā)進(jìn)行(應(yīng)用不停止),垃圾回收只暫停很少的時間,此收集器適合對響應(yīng)時間要求比較高的中、大規(guī)模應(yīng)用。使用-XX:+UseConcMarkSweepGC打開。

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

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

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

?

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

?

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

?

??? 啟動并發(fā)收集器: 因?yàn)椴l(fā)收集在應(yīng)用運(yùn)行時進(jìn)行收集,所以必須保證收集完成之前有足夠的內(nèi)存空間供程序使用,否則會出現(xiàn)“Concurrent Mode Failure”。通過設(shè)置-XX:CMSInitiatingOccupancyFraction=<N>指定還有多少剩余堆時開始執(zhí)行并發(fā)收集

?

?

小結(jié)

串行處理器:

--適用情況:數(shù)據(jù)量比較小(100M左右);單處理器下并且對響應(yīng)時間無要求的應(yīng)用。
--缺點(diǎn):只能用于小型應(yīng)用

?

并行處理器:

--適用情況:“對吞吐量有高要求”,多CPU、對應(yīng)用響應(yīng)時間無要求的中、大型應(yīng)用。舉例:后臺處理、科學(xué)計(jì)算。
--缺點(diǎn):垃圾收集過程中應(yīng)用響應(yīng)時間可能加長

?

并發(fā)處理器:

--適用情況:“對響應(yīng)時間有高要求”,多CPU、對應(yīng)用響應(yīng)時間有較高要求的中、大型應(yīng)用。舉例:Web服務(wù)器/應(yīng)用服務(wù)器、電信交換、集成開發(fā)環(huán)境。

?

?

JVM垃圾回收機(jī)制總結(jié)(3) :按代垃圾收集器


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 嫩江县| 杭州市| 开远市| 迁安市| 玉溪市| 略阳县| 松原市| 廊坊市| 昌江| 江门市| 沁阳市| 扶沟县| 东乌珠穆沁旗| 道孚县| 平原县| 大宁县| 榆林市| 吉林市| 湛江市| 道孚县| 乌苏市| 宁城县| 赫章县| 金平| 大名县| 巩义市| 舞钢市| 茂名市| 商丘市| 吉首市| 宜昌市| 凌云县| 清远市| 兴山县| 颍上县| 肥西县| 孟连| 揭西县| 阿克陶县| 云和县| 海门市|