垃圾回收机制和JVM垃圾回收常见算法
垃圾回收機(jī)制和JVM垃圾回收常見算法
垃圾回收的好處和特點(diǎn):
好處:
1.?提高編程效率;
2.?垃圾回收機(jī)制保護(hù)程序的完整性。
特點(diǎn):
1.?只能回收無(wú)用對(duì)象的內(nèi)存空間,對(duì)其他物理資源無(wú)能為力;
2.?為了更快回收不再使用的對(duì)象,可以將對(duì)象的引用變量設(shè)置為null
3.?垃圾回收不可預(yù)知性(不同的垃圾回收機(jī)制和不同的垃圾回收算法)
垃圾回收的精確性主要體現(xiàn)在以下方面:
1.?垃圾回收機(jī)能夠精確的標(biāo)記活著的對(duì)象(完全回收所以廢棄對(duì)象的前提)
2.?垃圾回收能夠精確的定位對(duì)象之間的引用關(guān)系(實(shí)現(xiàn)歸并和復(fù)制等算法的必要條件)
1. 標(biāo)記——清除算法(Mark-Sweep)
標(biāo)記——清除算法是第一種使用和比較完善的垃圾回收算法,算法分為兩個(gè)過程:
1、標(biāo)記所有需要回收的對(duì)象
2、標(biāo)記完成后清除被標(biāo)記的對(duì)象。其標(biāo)記的過程就是判斷對(duì)象有效性,執(zhí)行可達(dá)性分析的過程。其執(zhí)行流程圖大體如何下所示:?
同樣,我們也借助現(xiàn)實(shí)的場(chǎng)景進(jìn)行描述。圖書管里有好多人在看書,圖書管理員想要收集起沒有被看的書的時(shí)候,他決定讓所有正在看書的人站起來,然后詢問每個(gè)人:那一本書是不看的。詢問完所有的人之后,同學(xué)們做下繼續(xù)看書。這時(shí)候,圖書管理員開始尋找所有做過標(biāo)記的書,把它們收集起來。
缺點(diǎn):?
1、每次進(jìn)行垃圾回收時(shí),會(huì)暫停當(dāng)前用戶程序的運(yùn)行(類似讓所有的同學(xué)站起來)?
2、垃圾回收器需要間隔性的檢查,并且標(biāo)記和清除的過程相對(duì)較慢。?
3、在標(biāo)記清除之后可能會(huì)產(chǎn)生大量?jī)?nèi)存碎片,導(dǎo)致一旦需要為大對(duì)象分配空間時(shí),由于找不到足夠大的內(nèi)存空間,而不得以引發(fā)另外一次GC過程。
2. 標(biāo)記——復(fù)制算法(Mark——Copy)
標(biāo)記——復(fù)制存儲(chǔ)算法通過采用雙區(qū)域交替使用這種方式解決了標(biāo)記——清除算法中效率低下的問題。它將可用內(nèi)存劃分為兩個(gè)等量的區(qū)域(使用區(qū)和空閑區(qū)),每次只使用一塊。當(dāng)正在使用的區(qū)域需要進(jìn)行垃圾回收時(shí),存活的對(duì)象將被復(fù)制到另外一塊區(qū)域。原先被使用的區(qū)域被重置,轉(zhuǎn)為空閑區(qū)。其執(zhí)行流程大體如下所示:?
?
圖書管理員為了更好的發(fā)現(xiàn)不看的書,將圖書室一分為二(A區(qū)和B區(qū)),同一時(shí)刻只有一塊區(qū)域允許看書。開始時(shí)只允許在A區(qū)看書。當(dāng)管理員想要回收A區(qū)不被看的書的時(shí)候,大喊一嗓子“正在看書的同學(xué)拿著你書到B區(qū)”。等所有人都到了B區(qū)后,圖書管理員只要把A區(qū)的書收集起來,就完成了任務(wù)。下一次收集的時(shí)候,則是要求同學(xué)帶著自己看的書從B區(qū)轉(zhuǎn)移到A區(qū)。如此循環(huán)往復(fù)即可。
缺點(diǎn):?
1、原有可用空間被縮小為1/2,空間利用率降低了。?
2、過程中也會(huì)暫停當(dāng)前應(yīng)用的運(yùn)行。
3. 標(biāo)記——整理算法(Mark——Compat)(相對(duì)標(biāo)記--復(fù)制,少了一個(gè)保留區(qū))
標(biāo)記-復(fù)制算法在對(duì)象存活率較高的情況下就要進(jìn)行較多的復(fù)制操作,更重要的是該算法浪費(fèi)一半的內(nèi)存空間,為了解決該問題,出現(xiàn)了標(biāo)記——整理算法:其標(biāo)記的過程和“標(biāo)記-清除”算法一樣,而整理的過程則是讓所有存活的對(duì)象都向另外一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。其執(zhí)行流程大體如下所示:?
缺點(diǎn):?
1、暫停當(dāng)前應(yīng)用的運(yùn)行,非實(shí)時(shí)性的回收。
4. 分代收集算法
分代收集算法理論來源于統(tǒng)計(jì)學(xué)。IBM公司的專門研究發(fā)現(xiàn),對(duì)象的生存周期總體可分為三種:新生代、老年代和永久代。因此可以根據(jù)各個(gè)年代的特點(diǎn)采用適當(dāng)?shù)睦厥账惴ā1热缧律膶?duì)象在每次垃圾時(shí)都會(huì)有大量的對(duì)象死去,只有很少一部分存活,那就可以選擇標(biāo)記-復(fù)制算法。另外,在新生代中每次死亡對(duì)象約占98%,那么在標(biāo)記-復(fù)制算法中就不需要按照1:1的比例來劃分內(nèi)存區(qū)域,而是將新生代細(xì)分為了一塊較大的Eden和兩塊較小的Survivor區(qū)域,HotSpot中默認(rèn)這兩塊區(qū)域的大小比例為8:2。每次新生代可用區(qū)域?yàn)镋den加上其中一塊Survivor區(qū)域,共90%的內(nèi)存空間,這樣就只有10%的內(nèi)存空間處在被閑置狀態(tài)。在進(jìn)行垃圾回收時(shí),存活的對(duì)象被轉(zhuǎn)移到原本處在“空閑的”Eden區(qū)域。如果某次垃圾回收后,存活對(duì)象所占空間遠(yuǎn)大于這10%的內(nèi)存空間時(shí),也就是Survivor空間不夠用時(shí),需要額外的空間來?yè)?dān)保,通常是將這些對(duì)象轉(zhuǎn)移到老年代。對(duì)于老年代來說,大部分對(duì)象都處在存活狀態(tài)。同時(shí),如果一個(gè)大對(duì)象要在該區(qū)域進(jìn)行分配,而內(nèi)存空間又不足,那么在沒有外部?jī)?nèi)存空間擔(dān)保的情況下,就必須選用標(biāo)記-清除或者標(biāo)記-整理算法來進(jìn)行垃圾回收了。
總而言之,分代收集只是根據(jù)對(duì)象生存周期的不同來選擇不同的算法,其本身并沒有任何新思想。
5. 增量收集算法
以上所述的算法,都存在一個(gè)缺點(diǎn):在進(jìn)行垃圾回首時(shí)需要暫停當(dāng)前應(yīng)用的執(zhí)行,也就是這時(shí)候的垃圾回收線程不能和應(yīng)用線程同時(shí)運(yùn)行。如果我們想做到“在不打斷同學(xué)們看書的情況下,圖書管理員就可以收集沒有被看的書”,這也是增量收集算法的目標(biāo),即在不中斷應(yīng)用線程的狀態(tài)下垃圾回收線程也能進(jìn)行垃圾回收。但是這里需要面對(duì)的問題是:垃圾回收線程在標(biāo)記階段標(biāo)記好了,還沒來的及清除時(shí),當(dāng)前應(yīng)用線程進(jìn)行內(nèi)存操作,以至于清除階段無(wú)法正確開展,類似的情況是:圖書管理員剛標(biāo)記了《JAVA核心技術(shù)》這本書已經(jīng)沒有人看了,等標(biāo)記完后,卻發(fā)現(xiàn)這本書已經(jīng)有人在看了。
參考博文:https://blog.csdn.net/dd864140130/article/details/50084471
總結(jié)
以上是生活随笔為你收集整理的垃圾回收机制和JVM垃圾回收常见算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯大赛基础之--数列排序
- 下一篇: Spring Boot————Profi