国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

GC_4_GC復制算法

elarity / 1794人閱讀

摘要:什么是復制算法復制算法是利用空間進行分配的。另一方面,因為復制算法只搜索并復制活動對象,所以跟一般的標記清除算法相比,它能在短時間內完成,也就是說其吞吐量優秀。在復制算法中,每次運行時都會執行壓縮。

4 GC復制算法

??Copying GC是Marvin L.Minsky在1963年研究出來的算法。就是指把某個空間里的活動對象復制到其它空間,把原空間里的所有對象都回收掉。在此,將復制活動對象的原空間稱為From空間,將粘貼活動對象的新空間稱為To空間。

4.1 什么是GC復制算法
??GC復制算法是利用From空間進行分配的。當From空間被完全占滿時,GC會將活動對象全部復制到To空間。當復制完成后,該算法會把From空間和To空間互換,GC也就結束了。From空間和To空間大小必須一致。這是為了保證能把From空間中的所有活動對象都收納到

4.1.1 執行過程
假設目前堆里的配置如下。
??

執行GC。首先是從根直接引用的對象B和G,B先被復制到了To空間。

將B被復制后生成的對象稱為B’。在From空間中B已經被打上了復制完成標簽。但是,這里只把B’復制了過來,它的子對象A還在From空間里,下面把A復制到To空間里。
??

這次才是真正意義上復制了B。因為A沒有子對象,所以對A的復制就完成了。

接下來,要和復制B一樣從根引用復制G,以及其子對象E。雖然B也是G的子對象,不過因為已經復制完B了,所以只要把從G執行B的指針轉換到B’上。

最后,只要把From空間和To空間互換,GC就結束了。

對象C、D、F因為沒法從根查找,所以會被回收。這里程序是以B、A、G、E的順序搜索對象的,使用的是深度優先搜索。

4.2 優點
4.2.1 優秀的吞吐量

GC標記-清除算法消耗的吞吐量是搜索活動對象(標記階段)所花費的時間和搜索整體堆(清除階段)所花費的時間之和。

另一方面,因為GC復制算法只搜索并復制活動對象,所以跟一般的GC標記-清除算法相比,它能在短時間內完成GC,也就是說其吞吐量優秀。

尤其是堆越大,差距越明顯。GC標記-清除算法在清除階段所花費的時間會不斷增加,但GC復制算法就不會。因為它消耗的時間是與活動對象的數量成比例的。

4.2.2 可實現高速分配

GC復制算法不使用空閑鏈表,因為分塊是一塊連續的內存空間。因此,調查這個分塊的大小,只要這個分塊大小不小于所申請的大小,那么移動指針就可以進行分配了。

比起GC標記-清除算法和引用計數算法等使用空閑鏈表的分配,GC復制算法明顯快得多。使用空閑鏈表是為了找到滿足要求的分塊,需要遍歷空閑鏈表,最壞的情況是我們不得不從空閑鏈表中取出最后一個分塊,這樣就用了大量時間把所有分塊都調查一遍。

4.2.3 不會發生碎片化

基于算法性質,活動對象被集中安排在From空間的開頭。像這樣把對象重新集中,放在堆中一端的行為叫作壓縮。在GC復制算法中,每次運行GC時都會執行壓縮。

因此GC算法有個非常優秀的特點,就是不會發生碎片化,也就是說可以安排分塊允許范圍內大小的對象。

另一方面,在GC標記-清除算法等GC算法中,一旦安排了對象,原則上就不能再移動它了,所以會多多少少產生碎片化。

4.2.4 與緩存兼容

在GC復制算法中有引用關系的對象會被安排在堆里離彼此較近的位置。B’引用A’,G’引用E’的順序排列。這種情況有一個優點,那就是mutator執行速度極快。很多CPU都通過緩存來來高速讀取位置較近的對象。這也是借助壓縮來完成的,通過壓縮來把有引用關系的對象安排在堆中較近的位置。

4.3 缺點
4.3.1 堆使用率低下

GC復制算法把堆分成二等分,通常只能利用其中一半來安排對象。也就是說只有一半堆能被使用,相比其他能使用整個堆的GC算法而言,這是GC復制算法的一個重大缺陷。

4.3.2 不兼容保守式GC算法

GC標記-清除算法有著跟保守式GC算法相兼容的優點。因為GC標記-清除算法不用移動對象。

另一方面,GC復制算法必須移動對象重寫指針,所以有著跟保守式GC算法不相容的性質。雖然有限制條件,GC復制算法和保守式GC算法可以進行組合。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71535.html

相關文章

  • 【前端進階之路】內存基本知識

    摘要:在運行腳本時,需要顯示的指定對象。大對象區每一個區域都是由一組內存頁構成的。這里是唯一擁有執行權限的內存區。換句話說,是該對象被之后所能回收到內存的總和。一旦活躍對象已被移出,則在舊的半空間中剩下的任何死亡對象被丟棄。 內存管理 本文以V8為背景 對之前的文章進行重新編輯,內容做了很多的調整,使其具有邏輯更加緊湊,內容更加全面。 1. 基礎概念 1.1 生命周期 不管什么程序語言,內存...

    Simon_Zhou 評論0 收藏0
  • Java堆內存分配與回收策略

    摘要:主要在堆上分配內存,而堆又分為新生代和老年代兩個部分,新生代又再分為區和區兩部分,本文根據堆的劃分,描述的內存分配策略。 java主要在堆上分配內存,而Java堆又分為新生代(YoungGen)和老年代(OldGen)兩個部分,新生代又再分為Eden區和Survivor區兩部分,本文根據java堆的劃分,描述hotspot的內存分配策略。 showImg(https://segme...

    Steve_Wang_ 評論0 收藏0
  • 逐夢offer -- JVM篇

    摘要:的字節碼解釋器和編譯器使用寫屏障維護卡表。解釋器每次執行更新引用的字節碼時,都會執行一段寫屏障,編譯器在生成更新引用的代碼后,也會生成一段寫屏障。 4. JVM 4.1 GC 1. 垃圾收集 基礎 : 可達性分析算法 GC ROOTS 復制算法 標記清除 標記整理 分代收集 -- 1. 新生代 ; 2.3 老年代注: Oop Map -- 安全點 -- 安全區 以下部分內容 來自 ...

    greatwhole 評論0 收藏0
  • JAVA GC垃圾回收(及一次內存泄漏處理)

    摘要:垃圾回收及一次內存泄漏處理內存分布上圖展示了的架構圖,本篇我們主要關注,運行時數據區。但是垃圾回收并不能百分百保證不會出現內存泄漏,所以了解垃圾回收,對于我們遇到內存泄漏時能更加清晰的分析原因,也能幫助我們寫出更加安全,可靠的程序。 [toc] JAVA GC垃圾回收(及一次內存泄漏處理) showImg(https://segmentfault.com/img/remote/1460...

    RaoMeng 評論0 收藏0

發表評論

0條評論

elarity

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<