linux篇-基於域名的apache伺服器
阿新 • • 發佈:2022-05-20
概念
垃圾回收機制(Garbage Collection) 簡稱 GC
JS中記憶體的分配和回收都是自動完成的,記憶體在不使用的時候會被垃圾回收器自動回收。
正因為垃圾回收器的存在,許多人認為JS不用太關心記憶體管理的問題
但如果不瞭解JS的記憶體管理機制,我們同樣非常容易成記憶體洩漏(記憶體無法被回收)的情況
不再用到的記憶體,沒有及時釋放,就叫做記憶體洩漏
生命週期
- 記憶體分配:當我們宣告變數、函式、物件的時候,系統會自動為他們分配記憶體
- 記憶體使用:即讀寫記憶體,也就是使用變數、函式等
- 記憶體回收:使用完畢,由垃圾回收自動回收不再使用的記憶體
全域性變數一般不會回收(關閉頁面回收);
一般情況下區域性變數的值, 不用了, 會被自動回收掉
垃圾回收演算法
所謂垃圾回收, 核心思想就是如何判斷記憶體是否已經不再會被使用了, 如果是, 就視為垃圾, 釋放掉
下面介紹兩種常見的瀏覽器垃圾回收演算法: 引用計數法 和 標記清除法
-
引用計數法
IE採用的引用計數演算法, 定義“記憶體不再使用”的標準很簡單,就是看一個物件是否有指向它的引用。
演算法:
- 跟蹤記錄每個值被引用的次數。
- 如果這個值的被引用了一次,那麼就記錄次數1
- 多次引用會累加。
- 如果減少一個引用就減1。
- 如果引用次數是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()
-
標記清除法
核心:
-
標記清除演算法將“不再使用的物件”定義為“無法達到的物件”。
-
就是從根部(在JS中就是全域性物件)出發定時掃描記憶體中的物件。 凡是能從根部到達的物件,都是還需要使用的。
-
那些無法由根部出發觸及到的物件被標記為不再使用,稍後進 行回收。
-