這篇“js垃圾回收機制的原理是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“js垃圾回收機制的原理是什么”文章吧。
大多數語言都是提供自動內存管理機制,比如 C# 、Java ,JavaScript 。自動內存管理機制也就是我們經常聽到的垃圾回收機制 。好神奇哦,語言會收垃圾,哈哈,不過這里的垃圾,可不是家里面的廚余垃圾啥的,而是 一些不再使用的變量所占用的內存。我們的 JavaScript 的執行環境會自動對這些垃圾進行回收,也就是釋放那些不再使用的變量所占用的內存,收垃圾的過程 會按照固定的時間間隔周期性的執行 垃圾回收
如果 那些不再使用的變量所占用的內存 沒有被釋放 會怎樣呢??? 那就會造成 內存泄露
什么是內存泄露???別著急往下看
內存泄露其實就是我們的程序中已經動態分配的堆內存,由于某些原因沒有得到釋放,造成系統內存的浪費導致程序運行速度減慢甚至系統崩潰等嚴重后果。后果很嚴重的哦,現在知道為啥要有垃圾回收機制了嘛
看看這個代碼可以加深理解垃圾回收機制哦?
let name = '億速云';
function aboutMe() {
let hobby = '吃肉肉';
let say=`我是${name},我喜歡${hobby}`;
console.log(say);
}
aboutMe()在函數 aboutMe() 執行的時候,聲明了兩個局部的變量 hobby 和say ,等函數執行完畢之后,這兩個局部變量也就不再使用 ,所以垃圾回收機制 就會將不再使用的(局部)變量 hobby 和say 清除掉 (釋放了它們的內存)
在 JavaScript 中能實現這樣的垃圾回收的功能的一共有兩種方式:標記清除 和引用計數
標記清除是js中最常用的垃圾回收方式。它的原理也比較好理解,廢話不多說,先上代碼
function speakLines(){
let night="天黑";//做個標記 ,進入環境
let closeEyes="閉眼";//做個標記 ,進入環境
let speak=`開始狼人殺,${night}請${closeEyes}`;//做個標記 ,進入環境
console.log(speak);
}
speakLines() //代碼執行完畢 里面被標記過的變量,又被標記 離開環境 最后被回收當代碼執行在一個環境中時(例如上面的 speakLines函數),每聲明一個變量,就會對該變量做一個標記(例如標記一個進入執行環境);當代碼執行進入另一個環境中時,也就是要離開上一個環境( speakLines 函數執行完畢,去執行其他的函數),這時對上一個環境中的變量做一個標記,(例如標記一個離開執行環境),等到垃圾回收執行時,會根據標記來決定要清除哪些變量進行釋放內存
引用計數是一種不太常用的垃圾回收方式。同樣也是先上代碼再說原理
let skill = ["唱歌", "彈吉他", "播音"]
function change() {
let new_skill = ["vue", "react", "node", "webpack", ".net", "mysql", "sqlServer", "nginx"];
skill = new_skill;
//一個文藝小青年就這樣的變成了一個技術宅男
}
change()
console.log(skill) //返回 ["vue", "react", "node", "webpack", ".net", "mysql", "sqlServer", "nginx"]change()內部聲明了一個局部變量 new_skill,并將一個引用類型 的數組 賦值給它,同時又將變量new_skill賦值給了全局變量 skill,此時,這個局部變量 new_skill 就不會被當成垃圾回收了。啊,為什么呢??? 還記得我們在上面說過的 垃圾回收,回收的是那些不再使用的變量,釋放它們的內存,因為此時的局部變量 new_skill 并不是一個不再使用 的局部變量了,它被全局變量 skill所引用了( 還在使用),所以就不會被回收了。
上面的這一過程,使用的就是引用計數的垃圾回收方式
引用計數的策略是跟蹤記錄每個值被使用的次數,當聲明了一個變量并將一個引用類型賦值給該變量的時候這個值的引用次數就加1,如果該變量的值變成了另外一個,則這個值的引用次數減1,當這個值的引用次數變為0的時候,說明沒有變量在使用,這個值沒法被訪問了,因此可以將其占用的空間回收,當垃圾回收的時候,就會將 引用次數為0的進行回收,釋放對應的內存
let skill = ["唱歌", "彈吉他", "播音"]
function change() {
let new_skill = ["vue", "react", "node", "webpack", ".net", "mysql", "sqlServer", "nginx"];//被引用次數為0
skill = new_skill; ////被引用次數為1
}
change()
console.log(skill)在我們的項目中,我們肯定是想要用更少的內存,來使得頁面有更好的性能。這個時候就需要我們來手動的管理內存了,及時的去釋放數據的引用。我們可以只將需要的數據,存入變量。一旦這個數據不再使用了,我們需要手動的給變量賦值 null 來釋放數據的引用。(解除引用) 大多需要我們進行手動的解除引用的都是一些全局的變量,因為局部的變量,在離開環境的時候就會被自動清除了。
let skill = ["唱歌", "彈吉他", "播音"]
function change() {
let new_skill = ["vue", "react", "node", "webpack", ".net", "mysql", "sqlServer", "nginx"]
skill = new_skill;
//一個文藝小青年就這樣的變成了一個技術宅男
}
change()
console.log(skill)
skill = null;//將不再使用的變量進行賦值 unll 來釋放數據引用change() 內部聲明的局部變量 new_skill 被全局變量 skill 所引用,所以此時變量 new_skill 的引用次數為1,為了讓變量 new_skill 被清除引用,在代碼的最后一行,賦值一個 null 給全局變量 skill,手動解除了變量 skill 對變量 new_skill 的引用,此時變量 new_skill 的引用次數 減1,所以 當前 new_skill的引用次數為0了。當垃圾回收機制執行的時候,發現 new_skill 的引用次數為 0,就把該變量當成無用變量給清除了,釋放了內存,提高了性能。
以上就是關于“js垃圾回收機制的原理是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。