js垃圾回收及內存泄漏

js垃圾回收

  • js可以自動回收申請卻未使用的內存,因爲每次清除須要的性能較大,不是時時在刷新,而是每隔一段時間才進行一次。
  • 回收的兩種方式
    • 標記清除(經常使用) 在內存中先標記變量,而後清除那些那些進入環境或者引用的變量的標記,當進入環境退出環境,將被從新標記並被清除,釋放出內存。
    • 引用計數 計算變量被引用的次數,引用次數爲0將被清除釋放內存。 缺點:
      • 沒法清除那些引用次數不爲0,但又不須要的內存
       let arr = [1,2,3]; console.log('ok'); //數組[1,2,3]引用次數爲1,可是又沒用到就會一直佔着內存 //解決方式:arr.length=0 let arr = [1,2,3]; console.log('ok'); //數組[1,2,3]引用次數爲1,可是又沒用到就會一直佔着內存 //解決方式:arr.length=0
      • 沒法解決循環引用的問題
       function fn(){ let obj1 = {}; let obj2 = {}; obj1.a = obj2; obj2.b = obj1; } //解決方法:手動釋放 obj1 = null obj2 = null function fn(){ let obj1 = {}; let obj2 = {}; obj1.a = obj2; obj2.b = obj1; } //解決方法:手動釋放 obj1 = null obj2 = null

內存泄漏

  • 某些狀況沒法釋放內存,變量一直處於環境中
  • 出現內存泄漏的一些狀況
    • 最多見的就是閉包了
      • 閉包會建立一個不會被銷燬的棧內存。
      • 不經意的全局變量
       function fn(){ obj = {};//沒用聲明關鍵字,至關於建立了一個全局變量 } function fn(){ obj = {};//沒用聲明關鍵字,至關於建立了一個全局變量 }
      • 計時器沒有被清除
       setInterval() setTimeout() //解決方法 清除對應定時器的idsetInterval() setTimeout() //解決方法 清除對應定時器的id
滑稽臉
相關文章
相關標籤/搜索