1. <dd id="erndk"></dd>
                1. JS內存管理

                  互聯網 2022/1/4 7:09:34

                  內容概要: 在程序運行中,性能優化是必不可少的。從認識內存空間的使用,到垃圾回收的機制,一步步地寫出更高效的代碼 內存管理垃圾回收與常見GC算法V8引擎的垃圾回收Performance工具代碼優化示例 內存管理介紹: 內存: 由可讀寫單元組成, 表示一片可操作空間管理: 人…

                  內容概要:

                  在程序運行中,性能優化是必不可少的。從認識內存空間的使用,到垃圾回收的機制,一步步地寫出更高效的代碼

                  • 內存管理
                  • 垃圾回收與常見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

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>