您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“JVM中有幾種GC算法”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JVM中有幾種GC算法”這篇文章吧。
程序在運行過程中,會產(chǎn)生大量的內(nèi)存垃圾(一些沒有引用指向的內(nèi)存對象都屬于內(nèi)存垃圾,因為這些對象已經(jīng)無法訪問,程序用不了它們了,對程序而言它們已經(jīng)死亡),為了確保程序運行時的性能,java虛擬機在程序運行的過程中不斷地進行自動的垃圾回收(GC)。關于 JVM 的 GC 算法主要有下面四種:
每個對象在創(chuàng)建的時候,就給這個對象綁定一個計數(shù)器。每當有一個引用指向該對象時,計數(shù)器加一;每當有一個指向它的引用被刪除時,計數(shù)器減一。這樣,當沒有引用指向該對象時,該對象死亡,計數(shù)器為0,這時就應該對這個對象進行垃圾回收操作。
為每個對象額外存儲一個計數(shù)器 RC ,根據(jù) RC 的值來判斷對象是否死亡,從而判斷是否執(zhí)行 GC 操作。
簡單
計算代價分散
“幽靈時間”短(幽靈時間指對象死亡到回收的這段時間,處于幽靈狀態(tài))
不全面(容易漏掉循環(huán)引用的對象)
并發(fā)支持較弱
占用額外內(nèi)存空間
初始狀態(tài):
改變引用后:
為每個對象存儲一個標記位,記錄對象的狀態(tài)(活著或是死亡)。分為兩個階段,一個是標記階段,這個階段內(nèi),為每個對象更新標記位,檢查對象是否死亡;第二個階段是清除階段,該階段對死亡的對象進行清除,執(zhí)行 GC 操作。
最大的優(yōu)點是,相比于引用計數(shù)法,標記—清除算法中每個活著的對象的引用只需要找到一個即可,找到一個就可以判斷它為活的。
此外,這個算法相比于引用計數(shù)法更全面,在指針操作上也沒有太多的花銷。更重要的是,這個算法并不移動對象的位置(后面?zhèn)z算法涉及到移動位置的問題)。
很長的幽靈時間,判斷對象已經(jīng)死亡,消耗了很多時間,這樣從對象死亡到對象被回收之間的時間過長。
每個活著的對象都要在標記階段遍歷一遍;所有對象都要在清除階段掃描一遍,因此算法復雜度較高。
沒有移動對象,導致可能出現(xiàn)很多碎片空間無法利用的情況。
這個圖中,圓圈內(nèi)灰色的對象就是已經(jīng)死亡的對象,被標記為死亡,等待清除。
標記-整理法是標記-清除法的一個改進版。同樣,在標記階段,該算法也將所有對象標記為存活和死亡兩種狀態(tài);不同的是,在第二個階段,該算法并沒有直接對死亡的對象進行清理,而是將所有存活的對象整理一下,放到另一處空間,然后把剩下的所有對象全部清除。這樣就達到了標記-整理的目的。
該算法不會像標記-清除算法那樣產(chǎn)生大量的碎片空間。
如果存活的對象過多,整理階段將會執(zhí)行較多復制操作,導致算法效率降低。
如圖:
上面是標記階段,下面是整理之后的狀態(tài)??梢钥吹剑撍惴ú粫a(chǎn)生大量碎片內(nèi)存空間。
該算法將內(nèi)存平均分成兩部分,然后每次只使用其中的一部分,當這部分內(nèi)存滿的時候,將內(nèi)存中所有存活的對象復制到另一個內(nèi)存中,然后將之前的內(nèi)存清空,只使用這部分內(nèi)存,循環(huán)下去。
注意:
這個算法與標記-整理算法的區(qū)別在于,該算法不是在同一個區(qū)域復制,而是將所有存活的對象復制到另一個區(qū)域內(nèi)。
實現(xiàn)簡單
不產(chǎn)生內(nèi)存碎片
每次運行,總有一半內(nèi)存是空的,導致可使用的內(nèi)存空間只有原來的一半。
以上是“JVM中有幾種GC算法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。