js垃圾回收 js能夠自動回收申請卻未使用的記憶體,由於每次清除需要的性能較大,不是時時在刷新,而是每隔一段時間才進行一次。 回收的兩種方式 標記清除(常用) 在記憶體中先標記變數,然後清除那些那些進入環境或者引用的變數的標記,當進入環境退出環境,將被重新標記並被清除,釋放出記憶體。 引用計數 計算變數被 ...
js垃圾回收
- js能夠自動回收申請卻未使用的記憶體,由於每次清除需要的性能較大,不是時時在刷新,而是每隔一段時間才進行一次。
- 回收的兩種方式
- 標記清除(常用) 在記憶體中先標記變數,然後清除那些那些進入環境或者引用的變數的標記,當進入環境退出環境,將被重新標記並被清除,釋放出記憶體。
- 引用計數 計算變數被引用的次數,引用次數為0將被清除釋放記憶體。 缺點:
- 無法清除那些引用次數不為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(){ obj = {};//沒用聲明關鍵字,相當於創建了一個全局變數 }
- 計時器沒有被清除
setInterval() setTimeout() //解決方法 清除對應定時器的id
- 最常見的就是閉包了
滑稽臉