1. 程式人生 > 實用技巧 >《垃圾回收的演算法與實現》第1章學習GC之前

《垃圾回收的演算法與實現》第1章學習GC之前

《垃圾回收的演算法與實現》第1章學習GC之前

2020-10-21-22-58-08

垃圾回收系列連載:


第 1 章 學習GC之前 第 2 章 GC標記-清除演算法 第 3 章 引用計數法 第 4 章 GC複製演算法 第 5 章 GC標記-壓縮演算法 第 6 章 保守式GC 第 7 章 分代垃圾回收 第 8 章 增量式垃圾回收 第 9 章 RC Immix 演算法 第 10 章 Python 的垃圾回收 第 11 章 DalvikVM 的垃圾回收 第 12 章 Rubinius 的垃圾回收

電子書下載連結


第 1 章 學習GC之前

初識GC

  • GC的定義 GC,垃圾回收 就是把不要的東西丟掉。在程式裡面理解就是找到不再使用的記憶體空間,然後回收,後面可以再此使用回收掉的記憶體。
  • 為什麼需要GC C++裡面是程式設計師自己管理記憶體,操作指標,但是操作指標特別危險,會出現野指標,空指標。還有程式設計師要明確什麼時候釋放需要自己管理。Java就考慮到C++程式設計師的苦處,就想到讓語言本身去解決記憶體管理的問題,你們上層不用管,我來兜底。算是一種語言缺陷的補充。
  • GC的發展 每項技術都會有它的發展,都會有幾種策略的競爭,GC一開始是 標記-清除法,後面來了引用技術法,然後來了GC複製演算法,都是在解決前人的缺陷,當然也會帶來新問題,都有自己的長處和短處。

前置知識點

關於C++ 和 java基礎的知識點這裡不做贅述。

  • 物件頭 物件頭會包含 物件的大小 物件的種類的資訊

  • 物件域

    域中的資料型別分為兩種 指標和非指標。這裡就是java的資料型別要麼是常規資料型別 要麼是物件引用的意思。 20201021223904

  • mutato 就是程式的意思。

  • 就是引用物件的指標指向的儲存位置。 java裡面的物件的實體都存在堆中。

  • 根就是指向物件的指標的起點,呼叫棧、暫存器、全域性變數都是根。 這些根都是活動物件。 20201021224559

  • 吞吐量 下圖所示,HeapSize/(A+B+C) 就是吞吐量,管理越多的記憶體吞吐量越大,GC耗時越小吞吐量越大。 20201021224812

  • 最大暫停時間 這個是針對標記清除來說,因為標記和清除是要暫停的,不暫停會改變引用物件,那麼標記的非活動物件就可能髒了。

  • 堆使用效率 這個是針對複製演算法的,因為有一半的堆空間使用不到,那麼堆使用效率就很低了。

  • 訪問侷限性 這裡就是訪問的效率,跟語言無關,就是物件的引用關係說明他們是有可能會被連續訪問,那麼應該在記憶體中連續,這樣訪問速度會更快,那麼有的GC演算法會考慮到把有關聯的引用物件放在一起,比如複製演算法,計算引用就在拷貝,那麼就會放在一起。

請期待 “第 2 章 GC標記-清除演算法”

個人簡介:高階開發工程師,興趣和領域(Unity、Unreal、cocos creator、安卓終端開發、ios終端開發、音視訊開發、圖形學),歡迎加W:wlxklyh 探討問題。(歡迎star:https://github.com/wlxklyh/SoftRenderer)