JS內存管理
互聯網 2022/1/4 7:09:34
內容概要:
在程序運行中,性能優化是必不可少的。從認識內存空間的使用,到垃圾回收的機制,一步步地寫出更高效的代碼
- 內存管理
- 垃圾回收與常見GC算法
- V8引擎的垃圾回收
- Performance工具
- 代碼優化示例
內存管理介紹:
- 內存: 由可讀寫單元組成, 表示一片可操作空間
- 管理: 人為的去操作一片空間的申請、使用和釋放
- 內存管理: 開發者主動申請空間、 使用空間、 釋放空間
- 流程: 申請-使用-釋放
JS中的內存管理
JS中的內存管理是自動進行的,沒有相關API去進行實現,以下內容就可以看做是JS中的內存管理流程
-
申請空間
?
//聲明變量就可視為申請空間 let obj = {}
-
使用空間
?
//對變量的讀寫操作可視為使用空間 obj.name = "zoe" console.log(obj.name)
-
釋放空間
//把使用不到的變量手動置為空 obj = null
JS中的垃圾回收
JS中的垃圾定義:
- 對象不再被引用時是垃圾
- 對象不能從根(全局對象)上訪問到時是垃圾
JS中的可達對象
- 可以訪問到的對象就是可達對象(引用, 作用域鏈)
- 可達的標準就是從根出發能否被找到
- JS中的根可以理解為全局變量對象
JS中的垃圾回收就是找到垃圾, 讓內存引擎去回收這些空間
function objGroup (obj1, obj2) { obj1.next = obj2 obj2.prev = obj1 return { o1: obj1, o2: obj2 } } let obj = objGroup({name:' obj1'}, {name: 'obj2'}) console.log(obj) //此時obj, obj1, obj2都是可達對象,在全局對象上都是可以找到的
function objGroup (obj1, obj2) { obj1.next = obj2 obj2.prev = obj1 return { o1: obj1, o2: obj2 } } let obj = objGroup({name:' obj1'}, {name: 'obj2'}) console.log(obj) //把關于obj1的引用都刪除掉,obj1就會被認為是垃圾,從而被JS引擎回收 delete obj.o1 delete obj.o2.prev
GC算法介紹:
GC中的垃圾是什么
- 程序中不再需要使用的對象
- 程序全局變量對象中不能再訪問到的對象
GC算法是什么
- GC是一種機制,垃圾回收器完成具體的工作
- 工作的內容就是查找垃圾釋放空間、回收空間
- 算法就是工作時查找和回收所遵循的規則
常見GC算法
- 引用計數
- 標記清除
- 標記整理
- 分代回收(V8引擎)
引用計數算法:
實現原理:
? 為當前對象設置引用數,判斷當前對象引用數是否為0,如果為0,就將該對象進行回收,以釋放空間和再分配
引用計數器:
? 引用關系改變立即修改引用數字,為0時清除該對象
//user1 user2 user3都被list變量引用 const user1 = { num: 12} const user2 = { num: 23} const user3 = { num: 24} const list = [user1.num, user2.num, user3.num] function fn(){ //fn執行完畢,內部聲明的變量num1 num2都會被清除 const num1 = 1 const num2 = 2 } fn()
優點:
- 發現垃圾立即回收(一旦引用數為0,就會被回收)
- 最大限度減少程序暫停(一旦內存告急,就會去查找引用數為0的對象,以釋放空間)
缺點:
- 無法回收循環引用的對象(且回收判斷依據是引用數是否為0,即使是不可達對象,引用數不為0 也不會被清除掉)
- 每次賦值都要去計算相關的引用數,時間開銷大
let obj1 = {name: 'luffy'} let obj2 = {name: 'zoe'} obj1.ref = obj2 obj2.ref = obj1 //此時obj1和obj2互相引用,且沒有別的地方再去引用他們,因為他們的引用數都不是0, 就都不會被回收掉
標記清除算法
- 核心思想: 分標記和清除兩個階段完成
- 遍歷所有對象找標記活動對象
- 遍歷所有對象清除沒有標記的對象
優點:
- 相對于引用計數算法,會清理掉不可達對象
缺點:
- 回收后釋放的空間在地址上是不連續的,可能導致釋放的空間無法被使用
標記整理算法
標記整理算法可以看做是標記清除算法的增強版
流程:
- 標記階段按的操作與標記清除算法一致
- 清除階段會先進行內存空間的整理,移動對象位置, 然后再清除非活動對象
?

關于找一找教程網
本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
[JS內存管理]http://www.yachtsalesaustralia.com/tech/detail-279801.html
- 2022-05-20vue2.x版本中computed和watch的使用入門詳解-watch篇
- 2022-05-20Windows服務器下使用jenkis部署VUE項目
- 2022-05-20Element UI在線運行錯誤, (Uncaught ReferenceError: Vue is not defined)
- 2022-05-20vue 的toast組件
- 2022-05-19Jenkins自動構建部署vue項目到遠程Windows服務器上 騰訊工蜂(git) 一鍵打包+部署+解壓+發布(下)---jenkins的環境配置和使用
- 2022-05-19vue實現lodop打印功能--無感打印
- 2022-05-19面試之JS篇
- 2022-05-18vue axios 賦值后console可以查看到 html調用數據失敗
- 2022-05-18vue安裝
- 2022-05-18js 閉包的認知提升