什么是GC?

時(shí)間:2024-01-04 09:55:57 閱讀:6

什么是GC?

問:什么是GC?

答: 在Java言語中,渣滓吸收(Garbage Collection,GC)是一個(gè)十分緊張的看法,它的主要作用是吸收步驟中不再使用的內(nèi)存。

在使用C/C++言語舉行步驟開發(fā)時(shí),開發(fā)職員必需十分仔細(xì)腸辦理好內(nèi)存的分派與開釋,假如忘記大概錯(cuò)誤地開釋內(nèi)存屢屢會(huì)招致步驟運(yùn)轉(zhuǎn)不正常乃至是步驟崩潰。為了減小開發(fā)職員的事情,同時(shí)增長體系的寧靜性與安定性,Java言語提供了渣滓吸收器來主動(dòng)檢測(cè)目標(biāo)的作用域,可主動(dòng)地把不再被使用的存儲(chǔ)空間開釋掉。

具體而言,渣滓吸收器要賣力完成3項(xiàng)職責(zé):分派內(nèi)存、確保被引用目標(biāo)的內(nèi)存不被錯(cuò)誤地吸收以及吸收不再被引用的目標(biāo)的內(nèi)存空間。

渣滓吸收器的存在一方面把開發(fā)職員從開釋內(nèi)存的繁復(fù)事情中擺脫出來,提高了開發(fā)職員的消費(fèi)聽從;另一方面,對(duì)開發(fā)職員屏蔽了開釋內(nèi)存的辦法,可以制止因開發(fā)職員錯(cuò)誤地利用內(nèi)存而招致使用步驟的崩潰,確保了步驟的安定性。

但是,渣滓吸收也帶來了成績(jī),為了完成渣滓吸收,渣滓吸收器必需跟蹤內(nèi)存的使用情況,開釋沒用的目標(biāo),在完成內(nèi)存的開釋后還必要處理堆中的碎片,這些利用一定會(huì)增長JVM的包袱,從而低落步驟的實(shí)行聽從。

對(duì)目標(biāo)而言,假如沒有任何變量去引用它,那么該目標(biāo)將不成能被步驟拜候,因此可以以為它是渣滓信息,可以被吸收。只需有一個(gè)以上的變量引用該目標(biāo),該目標(biāo)就不會(huì)被渣滓吸收。

關(guān)于渣滓吸收器來說,它使用有向圖來紀(jì)錄和辦理堆內(nèi)存中的一切目標(biāo),經(jīng)過這個(gè)有向圖就可以識(shí)別哪些目標(biāo)是“可達(dá)的”(有引用變量引用它就是“可達(dá)的”),哪些目標(biāo)是“不成達(dá)的”(沒有引用變量引用它就是不成達(dá)的),一切“不成達(dá)”目標(biāo)都是可被渣滓吸收的,示比如下:

上述代碼在實(shí)行到i2=i1后,內(nèi)存的引用干系如下圖所示:

此時(shí),假如渣滓吸收器正在舉行渣滓吸收利用,在遍歷上述有向圖時(shí),資源2所占的內(nèi)存是不成達(dá)的,渣滓吸收器就會(huì)以為這塊內(nèi)存以前不會(huì)再被使用了,因此就會(huì)吸收該塊內(nèi)存空間。

渣滓吸收都是依據(jù)一定的算法舉行的,底下先容此中幾種常用的渣滓吸收算法。

  1. 引用計(jì)數(shù)算法(Reference Counting Collector)

引用計(jì)數(shù)作為一種簡(jiǎn)便但是聽從較低的辦法,其主要原理如下:在堆中對(duì)每個(gè)目標(biāo)都有一個(gè)引用計(jì)數(shù)器;當(dāng)目標(biāo)被引用時(shí),引用計(jì)數(shù)器加1;當(dāng)引用被置為空或分開作用域的時(shí),引用計(jì)數(shù)減1,由于這種辦法無法處理互相引用的成績(jī),因此JVM沒有接納這個(gè)算法。

  1. 追蹤吸收算法(TracingCollector)

追蹤吸收算法使用JVM維護(hù)的目標(biāo)引用圖,從根結(jié)點(diǎn)開頭遍歷目標(biāo)的使用圖,同時(shí)標(biāo)志遍歷到的目標(biāo)。當(dāng)遍歷完畢后,未被標(biāo)志的目標(biāo)就是現(xiàn)在已不被使用的目標(biāo),可以被吸收了。

  1. 緊縮吸收算法(CompactingCollector)

緊縮吸收算法的主要思緒如下:把堆中活動(dòng)的目標(biāo)挪動(dòng)到堆中一端,如此就會(huì)在堆中別的一端留出很大的一塊空閑地區(qū),相當(dāng)于對(duì)堆中的碎片舉行了處理。固然這種辦法可以大大簡(jiǎn)化消弭堆碎片的事情,但是每次處理都市帶來功能的喪失。

  1. 復(fù)制吸收算法(CopingCollector)

復(fù)制吸收算法的主要思緒如下:把堆分紅兩個(gè)輕重相反的地區(qū),在任何時(shí)候,僅有此中的一個(gè)地區(qū)被使用,直到這個(gè)地區(qū)的被斲喪完為止,此時(shí)渣滓吸收器會(huì)中綴步驟的實(shí)行,經(jīng)過遍歷的辦法把一切活動(dòng)的目標(biāo)復(fù)制到別的一個(gè)地區(qū)中,在復(fù)制的歷程中它們是緊挨著安插的,從而可以消弭內(nèi)存碎片。當(dāng)復(fù)制歷程完畢后步驟會(huì)接著運(yùn)轉(zhuǎn),直到這塊地區(qū)被使用完,然后再接納外表的辦法持續(xù)舉行渣滓吸收。

這個(gè)算法的優(yōu)點(diǎn)是在舉行渣滓吸收的同時(shí)對(duì)目標(biāo)的安插也舉行了安插,從而消弭了內(nèi)存碎片。但是這也奉獻(xiàn)了很高的代價(jià):關(guān)于指定輕重的堆來說,必要兩倍輕重的內(nèi)存空間;同時(shí)由于在內(nèi)存調(diào)停的歷程中要中綴如今實(shí)行的步驟,從而低落了步驟的實(shí)行聽從。

  1. 按代吸收算法(GenerationalCollector)

復(fù)制吸收算法主要的缺陷如下:每次算法實(shí)行時(shí),一切處于活動(dòng)形態(tài)的目標(biāo)都要被復(fù)制,如此聽從很低。由于步驟有“步驟創(chuàng)建的大局部目標(biāo)的生命周期都很短,僅有一局部目標(biāo)有較長的生命周期”的特點(diǎn),因此可以依據(jù)這個(gè)特點(diǎn)對(duì)算法舉行優(yōu)化。按代吸收算法的主要思緒如下:把堆分紅兩個(gè)大概多個(gè)子堆,每一個(gè)子堆被視為一代。算法在運(yùn)轉(zhuǎn)的歷程中優(yōu)先搜集那些“年幼”的目標(biāo),假如一個(gè)目標(biāo)顛末多次搜集仍舊“存活”,那么就可以把這個(gè)目標(biāo)轉(zhuǎn)移到高一級(jí)的堆里,變小對(duì)其的掃描次數(shù)。

稀有口試題:

  1. 現(xiàn)有如下代碼:

當(dāng)Float目標(biāo)在第2行被創(chuàng)建后,什么時(shí)分可以被渣滓吸收?()

A.4行今后

B.5行今后

C.6行今后

D.7行今后

答案:C。在第6行后不再有目標(biāo)引用Float目標(biāo)了,因此可以被渣滓吸收。

2.下列關(guān)于渣滓吸收的說法中,準(zhǔn)確的是()。

A.一旦一個(gè)目標(biāo)成為渣滓,就立刻被吸收掉

B.目標(biāo)空間被吸收掉之后,會(huì)實(shí)行該目標(biāo)的finalize辦法

C.finalize辦法和C++的析構(gòu)函數(shù)完善是一回事變

D.一個(gè)目標(biāo)成為渣滓是由于不再有引用指著它,但是線程并非云云

答案:D。成為渣滓的目標(biāo),僅有本人次渣滓吸收器運(yùn)轉(zhuǎn)時(shí)才會(huì)被吸收,而不是立刻被算賬,因此選項(xiàng)A錯(cuò)誤。finalize辦法是在目標(biāo)空間被吸收前調(diào)用的,因此選項(xiàng)B錯(cuò)誤。在C++言語中,調(diào)用了析構(gòu)函數(shù)后,目標(biāo)一定會(huì)被燒毀,而Java言語調(diào)用了finalize辦法,渣滓卻不一定會(huì)被吸收,因此finalize辦法與C++的析構(gòu)函數(shù)是不同的,以是選項(xiàng)C也不準(zhǔn)確。關(guān)于D,當(dāng)一個(gè)目標(biāo)不再被引用后就成為渣滓可以被吸收,但是線程就算沒有被引用也可以獨(dú)立運(yùn)轉(zhuǎn)的,因此與目標(biāo)不同。以是準(zhǔn)確答案為D。

3、對(duì)否可以主動(dòng)關(guān)照J(rèn)VM舉行渣滓吸收?

答案:由于渣滓吸收器的存在,Java言語本身沒有給開發(fā)職員提供顯式開釋已分派內(nèi)存的辦法,也就是說,開發(fā)職員不克不及及時(shí)地調(diào)用渣滓吸收器對(duì)某個(gè)目標(biāo)或一切目標(biāo)舉行渣滓吸收。但開發(fā)職員卻可以經(jīng)過調(diào)用System.gc()辦法來“關(guān)照”渣滓吸收器運(yùn)轉(zhuǎn),固然,JVM也并不會(huì)確保渣滓吸收器立刻就會(huì)運(yùn)轉(zhuǎn)。由于System.gc()辦法的實(shí)行會(huì)中止一切呼應(yīng),去反省內(nèi)存中對(duì)否有可吸收的目標(biāo),這會(huì)對(duì)步驟的正常運(yùn)轉(zhuǎn)以及功能形成極大的要挾,因此實(shí)踐編程時(shí),不保舉經(jīng)常使用這一辦法。


版權(quán)聲明:本文來自互聯(lián)網(wǎng)整理發(fā)布,如有侵權(quán),聯(lián)系刪除

原文鏈接:http://m.avtt22014.comhttp://m.avtt22014.com/qingganjiaoliu/41494.html


Copyright ? 2021-2022 All Rights Reserved 備案編號(hào):閩ICP備2023009674號(hào) 網(wǎng)站地圖 聯(lián)系:dhh0407@outlook.com

主站蜘蛛池模板: 日本高清成本人视频一区| 老司机午夜在线视频| 无码人妻一区二区三区免费n鬼沢| 国产免费人视频在线观看免费| 中文字幕日韩国产| 精品国产香蕉伊思人在线又爽又黄| 天天综合天天射| 亚洲国产精品网站久久| 黄色免费网站网址| 成人精品一区久久久久 | 大ji巴c死你h| 亚洲大片免费看| 韩国欧洲一级毛片免费| 尤物网在线视频| 亚洲欧美一区二区三区孕妇| 国产**一级毛片视频直播| 无码国产乱人伦偷精品视频| 伊人精品视频一区二区三区| 香蕉视频一区二区三区| 日本成本人视频| 免费一级特黄特色大片在线| 老司机69精品成免费视频| 无套后进式视频在线观看| 亚洲自偷自偷在线制服| 久久综合丝袜长腿丝袜| 成人中文乱幕日产无线码| 亚洲欧美日韩中文久久| 青青青伊人色综合久久| 女人把私人部位扒开视频在线看| 亚洲伊人久久大香线蕉啊| 老扒的幸福时光| 国产美女视频一区| 久久亚洲精品国产精品黑人| 男人边吃奶边做弄进去免费视频| 国产精品538一区二区在线| 中文字幕日产无码| 欧美精品中文字幕亚洲专区| 国产人妖ts在线视频观看| 99久久综合狠狠综合久久aⅴ | 色噜噜狠狠狠狠色综合久不| 在线精品91青草国产在线观看|