亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JVM垃圾回收機(jī)制總結(jié)(2) :基本算法概述

系統(tǒng) 1757 0

1、引用計(jì)數(shù)收集器 (Reference Counting)

?

????? 引用計(jì)數(shù)是垃圾收集的早期策略。在這種方法中, 堆中每一個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù)。一個(gè)對(duì)象被創(chuàng)建了,并且指向該對(duì)象的引用被分配給一個(gè)變量,這個(gè)對(duì)象的引用計(jì)數(shù)被置為1。當(dāng)任何其他變量被賦值為對(duì)這個(gè)對(duì)象的引用時(shí),計(jì)數(shù)加1。當(dāng)一個(gè)對(duì)象的引用超過了生存期或者被設(shè)置一個(gè)新的值時(shí),對(duì)象的引用計(jì)數(shù)減1。任何引用計(jì)數(shù)為0的對(duì)象可以被當(dāng)作垃圾收集。當(dāng)一個(gè)對(duì)象被垃圾收集的時(shí)候,它引用的任何對(duì)象計(jì)數(shù)值減1。 在這種方法中,一個(gè)對(duì)象被垃圾收集后可能導(dǎo)致后續(xù)其他對(duì)象的垃圾收集行動(dòng)。
????? 這種方法的好處是,引用計(jì)數(shù)收集器可以很快地執(zhí)行,交織在程序的運(yùn)行之中。這個(gè)特性對(duì)于程序不能被長(zhǎng)時(shí)間打斷的實(shí)時(shí)環(huán)境很有利。壞處就是,引用計(jì)數(shù)無法檢測(cè)出循環(huán)(即兩個(gè)或者更多的對(duì)象互相引用)。 循環(huán)的例子如,父對(duì)象有一個(gè)對(duì)子對(duì)象的引用,子對(duì)象又反過來引用父對(duì)象。這些對(duì)象永遠(yuǎn)都不可能計(jì)數(shù)為0,就算它們已經(jīng)無法被執(zhí)行程序的根對(duì)象可觸及。還有一個(gè)壞處就是,每次引用計(jì)數(shù)的增加或者減少都帶來額外開銷。
????? 因?yàn)橐糜?jì)數(shù)方法固有的缺陷,這種技術(shù)現(xiàn)在已經(jīng)不為人所接受。現(xiàn)實(shí)生活中所遇到的Java虛擬機(jī)更有可能在垃圾收集堆中使用追蹤算法。

?

2、標(biāo)記-清除收集器(Mark-Sweep)或追蹤回收器( Tracing Collector

?

???? ? 跟蹤收集器追蹤從根結(jié)點(diǎn)開始的對(duì)象引用圖。在追蹤過程中遇到的對(duì)象以某種方式打上標(biāo)記。 總的來說,要么在對(duì)象本身設(shè)置標(biāo)記,要么用一個(gè)獨(dú)立的位圖來設(shè)置標(biāo)記。 當(dāng)追蹤結(jié)束時(shí),未被標(biāo)記的對(duì)象就知道是無法觸及的,從而可以被收集。
????? 基本的追蹤算法被稱作“標(biāo)記并清除”。這個(gè)名字指出垃圾收集過程的兩個(gè)階段。在標(biāo)記階段,垃圾收集器遍歷引用樹,標(biāo)記每一個(gè)遇到的對(duì)象。在清除階段,未被標(biāo)記的對(duì)象被釋放了,使用的內(nèi)存被返回到正在執(zhí)行的程序。在Java虛擬機(jī)中,清除步驟必須包括對(duì)象的終結(jié)。下面的圖示顯示了這種收集器的收集過程:

?

垃圾回收器回收了堆中的對(duì)象之后,自然會(huì)在堆內(nèi)存中遺留下一些內(nèi)存空閑的間隙,下面就是完成上圖所示的標(biāo)記-清除垃圾回收之后的堆內(nèi)存變化,我們能很清楚的看到這一點(diǎn)。

?

下面我們就要討論如何對(duì)付這些回收對(duì)象后產(chǎn)生的內(nèi)存碎塊的垃圾回收器。

?

3、基于標(biāo)記-清除的壓縮收集器

????? 壓縮方法把活動(dòng)的對(duì)象越過空閑區(qū)滑動(dòng)到堆的一端,在這個(gè)過程中,堆的另一端出現(xiàn)一個(gè)大的連續(xù)空閑區(qū)。所有被移動(dòng)的對(duì)象的引用也被更新,指向新的位置。
????? 更新被移動(dòng)的對(duì)象的引用有時(shí)候通過一個(gè)間接對(duì)象引用層可以變得更簡(jiǎn)單。不直接引用堆中的對(duì)象,對(duì)象的引用實(shí)際上指向一個(gè)對(duì)象句柄表。對(duì)象句柄才指向堆中對(duì)象的實(shí)際位置。當(dāng)對(duì)象被移動(dòng)了,只有這個(gè)句柄需要被更新為新位置。所有的程序中對(duì)這個(gè)對(duì)象的引用仍然指向這個(gè)具有新值的句柄,而句柄本身沒有移動(dòng)。這種方法簡(jiǎn)化了消除堆碎塊的工作,但是每一次對(duì)象訪問都帶來了性能損失。

?

4、拷貝收集器

????? 一般的拷貝算法被稱為“停止并拷貝”、,在這個(gè)方案中,堆被分為兩個(gè)區(qū)域,任何時(shí)候都只使用其中的一個(gè)區(qū)域。對(duì)象在同一個(gè)區(qū)域中分配,直到這個(gè)區(qū)域被耗盡。此時(shí),程序執(zhí)行被中止、堆被遍歷,遍歷時(shí)遇到的活動(dòng)對(duì)象被拷貝到另外一個(gè)區(qū)域。當(dāng)停止和拷貝過程結(jié)束時(shí)。程序恢復(fù)執(zhí)行。內(nèi)存將從新的堆區(qū)域中分配,直到它也被用盡。那時(shí)程序?qū)⒃俅沃兄埂1闅v堆、活動(dòng)對(duì)象又被拷貝回原來的區(qū)域‘這種方一法帶來的代價(jià)就是,對(duì)于指定大小的堆來說需要兩倍大小的內(nèi)存,因?yàn)槿魏螘r(shí)候都只能使用其中的一半。下圖就是一個(gè)停止并拷貝的過程:

?

5、按代收集器(Generational Collector)?

????? 簡(jiǎn)單的停止并拷貝收集器的缺點(diǎn)是每一次收集時(shí),所有的活動(dòng)對(duì)象都必須被拷貝。大部分語(yǔ)言的大多數(shù)程序都有以下特點(diǎn),如果我們?nèi)婵紤]這些,拷貝算法的這個(gè)缺點(diǎn)足可以被改進(jìn)的。

????? (1) 大多數(shù)程序創(chuàng)建的大部分對(duì)象都具有很短的生命期。
????? (2)大多數(shù)程序都創(chuàng)建一些具有非常長(zhǎng)生命周期的對(duì)象。

????? 簡(jiǎn)單的拷貝收集器浪費(fèi)效率的一個(gè)上要原因就是、它們每次都把這些生命周期很長(zhǎng)的對(duì)象來回拷貝,消耗大量時(shí)間。???

????? 按代收集的收集器通過把對(duì)象按照壽命來分組解決這個(gè)效率低下的問題,更多地收集那些短暫出現(xiàn)的年幼對(duì)象,而非壽命較長(zhǎng)的對(duì)象。在這種方法里,堆被劃分成兩個(gè)或者更多的子堆,
每一個(gè)子堆為一“代”對(duì)象服務(wù)。最年幼的那一代進(jìn)行最頻繁的垃圾收集。因?yàn)榇蠖鄶?shù)對(duì)象都是短促出現(xiàn)的,只有很小部分的年幼對(duì)象可以在它們經(jīng)歷第一次收集后還存活。如果一個(gè)最年幼的對(duì)象經(jīng)歷了好幾次垃圾收集后仍然存活,那么這個(gè)對(duì)象就成長(zhǎng)為壽命更高的一代:它被轉(zhuǎn)移到另外一個(gè)子堆中去。年齡更高的每一代的收集都沒有年徑的那一代來得頻繁。每當(dāng)對(duì)象在它所屬的年齡層(代)中變得成熟(逃過了多次垃圾收集)之后,它們就被轉(zhuǎn)移到更高的年齡層中去。

????? 按代進(jìn)行的收集技術(shù)除了可以應(yīng)用于拷貝算法,也可以應(yīng)用于標(biāo)記并清除算法。不管在哪種情況下,把堆按照對(duì)象年齡層分解都可以提高最基本的垃級(jí)收集算法的性能。

?

?

總結(jié)

????? 引用計(jì)數(shù)收集器 基本上已經(jīng)不被使用了。 標(biāo)記-清除收集器 是目前尋找垃圾對(duì)象的主流策略,但是它對(duì)回收后產(chǎn)生的內(nèi)存碎片卻無能為力,因此我們必須采用一些合并空閑內(nèi)存的算法,這就產(chǎn)生了基于標(biāo)記-清除的 壓縮收集器 拷貝收集器 。而基于性能原因,拷貝收集器是比較受歡迎的。但是它有一個(gè)比較大的弱點(diǎn):對(duì)于壽命較長(zhǎng)的對(duì)象會(huì)不停的拷貝,這就付出了不必要的代價(jià)。因此, 按代收集器 的出現(xiàn) 改進(jìn)了這一性能。而我們的JDK中的JVM就采用了按代收集策略。? ?

?

?

垃圾回收的若干問題


(1) 垃圾回收從哪里開始??

?

?? ?? 上面說到的“引用計(jì)數(shù)”法,通過統(tǒng)計(jì)控制生成對(duì)象和刪除對(duì)象時(shí)的引用數(shù)來判斷。垃圾回收程序收集計(jì)數(shù)為0的對(duì)象即可。但是這種方法無法解決循環(huán)引用。所 以,后來實(shí)現(xiàn)的垃圾判斷算法中,都是從程序運(yùn)行的根節(jié)點(diǎn)出發(fā),遍歷整個(gè)對(duì)象引用,查找存活的對(duì)象。那么在這種方式的實(shí)現(xiàn)中, 垃圾回收從哪兒開始的呢 ? 即,從哪兒開始查找哪些對(duì)象是正在被當(dāng)前系統(tǒng)使用的。上面分析的堆和棧的區(qū)別,其中棧是真正進(jìn)行程序執(zhí)行地方,所以要獲取哪些對(duì)象正在被使用,則需要從 Java棧開始。同時(shí),一個(gè)棧是與一個(gè)線程對(duì)應(yīng)的,因此,如果有多個(gè)線程的話,則必須對(duì)這些線程對(duì)應(yīng)的所有的棧進(jìn)行檢查。

?? ??? 同時(shí),除了棧外,還有系統(tǒng)運(yùn)行時(shí)的寄存器等,也是存儲(chǔ)程序運(yùn)行數(shù)據(jù)的。這樣,以棧或寄存器中的引用為起點(diǎn),我們可以找到堆中的對(duì)象,又從這些對(duì)象找到對(duì) 堆中其他對(duì)象的引用,這種引用逐步擴(kuò)展,最終以null引用或者基本類型結(jié)束,這樣就形成了一顆以Java棧中引用所對(duì)應(yīng)的對(duì)象為根節(jié)點(diǎn)的一顆對(duì)象樹,如 果棧中有多個(gè)引用,則最終會(huì)形成多顆對(duì)象樹。在這些對(duì)象樹上的對(duì)象,都是當(dāng)前系統(tǒng)運(yùn)行所需要的對(duì)象,不能被垃圾回收。而其他剩余對(duì)象,則可以視為無法被引 用到的對(duì)象,可以被當(dāng)做垃圾進(jìn)行回收。

??????? 因此, 垃圾回收的起點(diǎn)是一些根對(duì)象(java棧, 靜態(tài)變量, 寄存器...) 。而最簡(jiǎn)單的Java棧就是Java程序執(zhí)行的main函數(shù)。這種回收方式,也是上面提到的“標(biāo)記-清除”的回收方式。

(2) 如何處理碎片??

?? 由于不同Java對(duì)象存活時(shí)間是不一定的,因此,在程序運(yùn)行一段時(shí)間以后,如果不進(jìn)行內(nèi)存整理,就會(huì)出現(xiàn)零散的內(nèi)存碎片。碎片最直接的問題就是會(huì)導(dǎo)致無法 分配大塊的內(nèi)存空間,以及程序運(yùn)行效率降低。所以,在上面提到的基本垃圾回收算法中, 基于標(biāo)記-清除的壓縮收集器和拷貝收集器 ,都可以解決碎片的問題。

(3) 如何解決同時(shí)存在的對(duì)象創(chuàng)建和對(duì)象回收問題??

?? ?? 垃圾回收線程是回收內(nèi)存的,而程序運(yùn)行線程則是消耗(或分配)內(nèi)存的, 一個(gè)回收內(nèi)存,一個(gè)分配內(nèi)存 ,從這點(diǎn)看,兩者是矛盾的。因此,在現(xiàn)有的垃圾回收方式中,要進(jìn)行垃圾回收前,一般都需要暫停整個(gè)應(yīng)用(即:暫停內(nèi)存的分配),然后進(jìn)行垃圾回收,回收完成后再繼續(xù)應(yīng)用。這種實(shí)現(xiàn)方式是最直接,而且最有效的解決二者矛盾的方式。

????? 但是 這種方式有一個(gè)很明顯的弊端,就是當(dāng)堆空間持續(xù)增大時(shí),垃圾回收的時(shí)間也將會(huì)相應(yīng)的持續(xù)增大,對(duì)應(yīng)應(yīng)用暫停的時(shí)間也會(huì)相應(yīng)的增大 一些對(duì)相應(yīng)時(shí)間要求很高的應(yīng)用,比如最大暫停時(shí)間要求是幾百毫秒,那么當(dāng)堆空間大于幾個(gè)G時(shí),就很有可能超過這個(gè)限制,在這種情況下,垃圾回收將會(huì)成為系統(tǒng)運(yùn)行的一個(gè)瓶頸。為解決這種矛盾,有了 并發(fā)垃圾回收算法 ,使用這種算法,垃圾回收線程與程序運(yùn)行線程同時(shí)運(yùn)行。在這種方式下,解決了暫停的問題,但是因?yàn)樾枰谛律蓪?duì)象的同時(shí)又要回收對(duì)象,算法復(fù)雜性會(huì)大大增加,系統(tǒng)的處理能力也會(huì)相應(yīng)降低,同時(shí),“碎片”問題將會(huì)比較難解決。

?

JVM垃圾回收機(jī)制總結(jié)(2) :基本算法概述


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天miya | 欧美交换乱理伦片在线观看 | 久久亚洲精品一区二区三区浴池 | 国产精品亚洲精品一区二区三区 | 久久精品福利视频 | 久久狠狠婷婷丁香香蕉 | 久久精品视频在线播放 | 国产一区二区三区国产精品 | 欧美高清在线精品一区 | 久一在线视频 | 天天操夜夜夜 | 色综合91久久精品中文字幕 | 四虎永久免费观看紧急入口 | 99热这里只有精品6免费 | 国产美女mm131爽爽爽免费 | 欧美伊香蕉久久综合类网站 | 伊人天伊人天天网综合视频 | 四虎影院网站 | 97在线影院 | 国产一区二区亚洲精品天堂 | 2021国产成人综合亚洲精品 | 亚洲天堂三区 | 欧美5o老妇性xxx | 久久国产午夜精品理论片34页 | 5252色欧美在线男人的天堂 | 视频一区二区三区在线观看 | 欧美午夜精品久久久久免费视 | 国产精品久久久久久久久久98 | 成人在线第一页 | 国产麻豆精品高清在线播放 | 久久99久久精品国产99热 | 久久久视频在线 | 国产综合欧美 | 欧美亚洲综合在线观看 | 四虎 在线播放 | 精品国产免费一区二区 | 激情综合色综合久久综合 | 国产视频观看 | 国产亚洲综合在线 | 国产精品人伦久久 | 国产区精品在线 |