1. 程式人生 > 其它 >linux篇-基於域名的apache伺服器

linux篇-基於域名的apache伺服器

概念

垃圾回收機制(Garbage Collection) 簡稱 GC

JS中記憶體的分配和回收都是自動完成的,記憶體在不使用的時候會被垃圾回收器自動回收。

正因為垃圾回收器的存在,許多人認為JS不用太關心記憶體管理的問題

但如果不瞭解JS的記憶體管理機制,我們同樣非常容易成記憶體洩漏(記憶體無法被回收)的情況

不再用到的記憶體,沒有及時釋放,就叫做記憶體洩漏

生命週期

  1. 記憶體分配:當我們宣告變數、函式、物件的時候,系統會自動為他們分配記憶體
  2. 記憶體使用:即讀寫記憶體,也就是使用變數、函式等
  3. 記憶體回收:使用完畢,由垃圾回收自動回收不再使用的記憶體

全域性變數一般不會回收(關閉頁面回收);

一般情況下區域性變數的值, 不用了, 會被自動回收掉

垃圾回收演算法

所謂垃圾回收, 核心思想就是如何判斷記憶體是否已經不再會被使用了, 如果是, 就視為垃圾, 釋放掉

下面介紹兩種常見的瀏覽器垃圾回收演算法: 引用計數法 和 標記清除法

  • 引用計數法

    IE採用的引用計數演算法, 定義“記憶體不再使用”的標準很簡單,就是看一個物件是否有指向它的引用。

    演算法:

    1. 跟蹤記錄每個值被引用的次數。
    2. 如果這個值的被引用了一次,那麼就記錄次數1
    3. 多次引用會累加。
    4. 如果減少一個引用就減1。
    5. 如果引用次數是0 ,則釋放記憶體。
        // 宣告 計數+1  引用計數值: 1
        const person = {
          uname : 'a',
          age : 123,
        }
    
        // 引用 計數+1   引用計數值: 2
        const p = person
    
        // 不再引用 計數-1  引用計數值: 1
        person = 1
    
        // 不再引用 計數-1  引用計數值: 0 
        p = null
    
        // 引用計數為0,自動釋放記憶體
    

    引用計數演算法是個簡單有效的演算法。

    但它卻存在一個致命的問題:巢狀引用

    如果兩個物件相互引用,儘管他們已不再使用,垃圾回收器不會進行回收,導致記憶體洩露。

        function fn() {
          // 宣告變數 計數+1
          //o1  計數 +1   1
          let o1 = {}
          //o2  計數 +1   1
          let o2 = {}
    
          // o1新增屬性a
          // o2  計數 +1   2   
          o1.a = o2
    
          // o2新增屬性a
          // o1  計數 +1   2 
          o2.a = o1
          return '引用計數無法回收' 
          // 函式執行完畢,o1,o2  計數 -1   1
          // 引用計數不為0,,不能及時釋放,記憶體洩漏
        }
          
        fn()
    
  • 標記清除法

    核心:

    1. 標記清除演算法將“不再使用的物件”定義為“無法達到的物件”。

    2. 就是從根部(在JS中就是全域性物件)出發定時掃描記憶體中的物件。 凡是能從根部到達的物件,都是還需要使用的。

    3. 那些無法由根部出發觸及到的物件被標記為不再使用,稍後進 行回收。