1. 程式人生 > 實用技巧 >【Vue】vue 單向繫結& 雙向繫結

【Vue】vue 單向繫結& 雙向繫結

python採用的是引用計數機制為主,標記-清除和分代收集兩種機制為輔的策略

  • 引用計數(python預設):記錄該物件當前被引用的次數,每當新的引用指向該物件時,它的引用計數ob_ref加1,每當該物件的引用失效時計數ob_ref減1,一旦物件的引用計數為0,該物件立即被回收
  • 標記清除:第一段給所有活動物件標記,第二段清除非活動物件
  • 分代回收:python將記憶體根據物件的存活時間劃分為不同的集合,每個集合稱為一個代,比如有年輕代、中年代、老年代,年輕代最先被回收

GC作為現代程式語言的自動記憶體管理機制,專注於兩件事:1. 找到記憶體中無用的垃圾資源 2. 清除這些垃圾並把記憶體讓出來給其他物件使用。

引用計數

Python語言預設採用的垃圾收集機制是『引用計數法 』『引用計數法』的原理是:每個物件維護一個ob_ref欄位,用來記錄該物件當前被引用的次數,每當新的引用指向該物件時,它的引用計數ob_ref加1,每當該物件的引用失效時計數ob_ref減1,一旦物件的引用計數為0,該物件立即被回收,物件佔用的記憶體空間將被釋放。它的缺點是需要額外的空間維護引用計數,這個問題是其次的,不過最主要的問題是它不能解決物件的“迴圈引用”,因此,也有很多語言比如Java並沒有採用該演算法做來垃圾的收集機制。

標記清除

『標記清除(Mark—Sweep)』演算法是一種基於追蹤回收(tracing GC)技術實現的垃圾回收演算法。它分為兩個階段:第一階段是標記階段,GC會把所有的『活動物件』打上標記,第二階段是把那些沒有標記的物件『非活動物件』進行回收。那麼GC又是如何判斷哪些是活動物件哪些是非活動物件的呢?

物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而引用關係構成這個有向圖的邊。從根物件(root object)出發,沿著有向邊遍歷物件,可達的(reachable)物件標記為活動物件,不可達的物件就是要被清除的非活動物件。根物件就是全域性變數、呼叫棧、暫存器。

分代回收

分代回收是一種以空間換時間的操作方式,Python將記憶體根據物件的存活時間劃分為不同的集合,每個集合稱為一個代,Python將記憶體分為了3“代”,分別為年輕代(第0代)、中年代(第1代)、老年代(第2代),他們對應的是3個連結串列,它們的垃圾收集頻率與物件的存活時間的增大而減小。新建立的物件都會分配在年輕代,年輕代連結串列的總數達到上限時,Python垃圾收集機制就會被觸發,把那些可以被回收的物件回收掉,而那些不會回收的物件就會被移到中年代去,依此類推,老年代中的物件是存活時間最久的物件,甚至是存活於整個系統的生命週期內。同時,分代回收是建立在標記清除技術基礎之上。分代回收同樣作為Python的輔助垃圾收集技術處理那些容器物件