JavaScript的垃圾回收機(jī)制與內(nèi)存管理
如果我們想要優(yōu)化性能,首先我們必須得了解JavaScript中的垃圾回收機(jī)制,這樣可以將很多沒(méi)有被使用到的變量從內(nèi)存中清除掉,騰出更多的內(nèi)存空間,給別的變量分配內(nèi)存空間。
JavaScript中的垃圾回收機(jī)制
引言
本篇文章將講解一下javascript的垃圾回收機(jī)制。同時(shí),我們必須先具備作用域鏈的概念,不懂的小伙伴可以先花5分鐘觀(guān)看一下這篇文章,簡(jiǎn)單了解一下作用域鏈的知識(shí)——從零開(kāi)始講解JavaScript中作用域鏈的概念及用途
正文
一、垃圾回收機(jī)制
在JavaScript中,具有自動(dòng)垃圾回收機(jī)制,也就是說(shuō)執(zhí)行環(huán)境會(huì)自動(dòng)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中的內(nèi)存使用情況,會(huì)自動(dòng)清除一些沒(méi)有用的變量,以此來(lái)釋放內(nèi)存。該機(jī)制每隔一段時(shí)間會(huì)執(zhí)行一次。
例如下面這段代碼,函數(shù) change 在執(zhí)行時(shí),聲明了一個(gè)局部變量my_color,然后等函數(shù)執(zhí)行完畢以后,這個(gè)局部變量也沒(méi)有作用了,所以這時(shí)垃圾回收機(jī)制就會(huì)將這個(gè)沒(méi)用的的局部變量my_color給清除掉。
let color = 'red'
function change() {
let my_color = 'blue'
color = 'green'
}
change()
JavaScript中能實(shí)現(xiàn)這樣的垃圾回收的功能的一共有兩種方式: 標(biāo)記清除 、引用計(jì)數(shù)
(1)標(biāo)記清除
標(biāo)記清除是JavaScript中最常用的垃圾回收方式。它的實(shí)現(xiàn)方式是這樣的,當(dāng)代碼執(zhí)行在一個(gè)環(huán)境中時(shí),每聲明一個(gè)變量,就會(huì)對(duì)該變量做一個(gè)標(biāo)記,例如標(biāo)記一個(gè)進(jìn)入執(zhí)行環(huán)境;當(dāng)代碼執(zhí)行進(jìn)入另一個(gè)環(huán)境中時(shí),也就是說(shuō)要離開(kāi)上一個(gè)環(huán)境,這時(shí)對(duì)上一個(gè)環(huán)境中的變量做一個(gè)標(biāo)記,例如標(biāo)記一個(gè)離開(kāi)執(zhí)行環(huán)境,等到垃圾回收?qǐng)?zhí)行時(shí),會(huì)根據(jù)標(biāo)記來(lái)決定要清除哪些變量。
(2)引用計(jì)數(shù)
引用計(jì)數(shù)是一種不太常用的垃圾回收方式。顧名思義,就是針對(duì)值為引用類(lèi)型數(shù)據(jù)的變量進(jìn)行計(jì)數(shù),那么我們先來(lái)看一下以下這個(gè)例子,來(lái)理解一下這個(gè)方式的實(shí)現(xiàn)方式
let color = [1, 2, 3]
function change() {
let new_color = [4, 5, 6]
color = new_color
}
change()
console.log(color) //返回 [4, 5, 6]
這個(gè)例子中的函數(shù)change內(nèi)部聲明了一個(gè)變量new_color,并將一個(gè)引用類(lèi)型值賦值給它,同時(shí)又將變量new_color賦值給了全局變量color,那么這種情況下,這個(gè)局部變量new_color就不會(huì)被當(dāng)成垃圾回收了,因?yàn)榇藭r(shí)的變量new_color并不是一個(gè)無(wú)用的局部變量了,它被全局變量color所引用了。
那么為什么變量new_color不會(huì)被當(dāng)成垃圾回收呢?其實(shí)引用計(jì)數(shù)的垃圾回收方式是這樣的,當(dāng)聲明一個(gè)變量時(shí),會(huì)給該變量設(shè)定一個(gè)值為0的引用次數(shù),當(dāng)該變量被別的變量所引用,就將引用次數(shù)+1,若取消了原本的引用,則引用次數(shù)-1,而垃圾回收機(jī)制就是判斷一個(gè)變量的值的引用數(shù)是否為0,如果為0,就被當(dāng)成無(wú)用變量給回收掉,如果不為0,則不對(duì)該變量做任何的處理。
二、管理內(nèi)存
有時(shí)我們需要手動(dòng)管理一下內(nèi)存的分配和清除,應(yīng)該很好理解,如果有更大的內(nèi)存空間,因?yàn)榭梢越o更多的變量分配內(nèi)存,就會(huì)提高代碼運(yùn)行的效率,增加線(xiàn)程中能夠執(zhí)行的代碼語(yǔ)句的數(shù)量。
所以我們要確保占用更少的內(nèi)存使得頁(yè)面獲得更好的性能,就可以只將需要用到的數(shù)據(jù)保存到變量中,一旦數(shù)據(jù)不再使用,我們可以通過(guò)給變量賦值null來(lái)釋放數(shù)據(jù)的引用,這種方法就叫做解除引用。這種方法大多數(shù)是用于全局變量,因?yàn)榫植孔兞恳话阍陔x開(kāi)環(huán)境以后就會(huì)被自動(dòng)清除。
我們來(lái)改變一下上面這個(gè)例子,使得變量new_color被引用完后,當(dāng)成無(wú)用變量給清除掉
let color = [1, 2, 3]
function change() {
let new_color = [4, 5, 6]
color = new_color
}
change()
console.log(color) //返回 [4, 5, 6]
color = null
在這個(gè)例子中,函數(shù)change內(nèi)部聲明的變量new_color被全局變量color所引用,所以此時(shí)變量new_color的引用次數(shù)為1,我們?yōu)榱俗屪兞縩ew_color被清除,所以在代碼的最后一行,賦值一個(gè)null給全局變量color,手動(dòng)解除了變量color對(duì)變量new_color的引用,此時(shí)變量new_color的引用次數(shù)-1,所以啊當(dāng)前它的引用次數(shù)為0了。當(dāng)垃圾回收機(jī)制執(zhí)行的時(shí)候,發(fā)現(xiàn)它的引用次數(shù)為0,就把該變量當(dāng)成無(wú)用變量給清除了,釋放了內(nèi)存。
結(jié)束語(yǔ)
理解了js的垃圾回收機(jī)制,我們才能修改代碼對(duì)性能進(jìn)行優(yōu)化 。好了,JavaScript的垃圾回收機(jī)制的講解就講到這里,希望對(duì)大家有所幫助。
我是前端Lpyexplore,原創(chuàng)不易,喜歡我的文章的點(diǎn)個(gè)關(guān)注,甩個(gè)贊,不嫌麻煩的評(píng)論支持一下,謝謝大家啦~
到此這篇關(guān)于JavaScript的垃圾回收機(jī)制與內(nèi)存管理的文章就介紹到這了,更多相關(guān)JavaScript的垃圾回收機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript設(shè)計(jì)模式之裝飾者模式實(shí)例詳解
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之裝飾者模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了裝飾者模式的概念、原理及javascript定義、使用裝飾者模式的相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
JavaScript獲得url查詢(xún)參數(shù)的方法
這篇文章主要介紹了JavaScript獲得url查詢(xún)參數(shù)的方法,可實(shí)現(xiàn)針對(duì)URL中參數(shù)分析的功能,需要的朋友可以參考下2015-07-07
javascript 獲取iframe里頁(yè)面中元素值的方法
本篇文章主要是對(duì)javascript獲取iframe里頁(yè)面中元素值的方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
JavaScript 中字符串和數(shù)組的概念解析與多角度對(duì)比區(qū)分
JavaScript中的字符串和數(shù)組是兩種重要的數(shù)據(jù)結(jié)構(gòu),各有特點(diǎn)和應(yīng)用場(chǎng)景,字符串主要用于文本處理,是不可變的;數(shù)組用于存儲(chǔ)有序集合,是可變的,理解它們的區(qū)別和應(yīng)用場(chǎng)景,有助于編寫(xiě)更高效和易維護(hù)的代碼,感興趣的朋友跟隨小編一起看看吧2024-11-11
Pyqt5實(shí)現(xiàn)多線(xiàn)程程序的使用示例
Pyqt常常使用主從架構(gòu)(Master-Workers 架構(gòu))來(lái)避免界面卡死的情況,本文主要介紹了Pyqt5實(shí)現(xiàn)多線(xiàn)程程序的使用示例,感興趣的可以了解一下2023-11-11
JavaScript中判斷整數(shù)的多種方法總結(jié)
這篇文章主要介紹了JavaScript中判斷整數(shù)的多種方法總結(jié),本文總結(jié)了5種判斷整數(shù)的方法,如取余運(yùn)算符判斷、Math.round、Math.ceil、Math.floor判斷等,需要的朋友可以參考下2014-11-11
Qt利用布局widget和ScrollArea實(shí)現(xiàn)抽屜效果(實(shí)例代碼)
這篇文章主要介紹了Qt利用布局,widget和ScrollArea實(shí)現(xiàn)抽屜效果,本文通過(guò)實(shí)例代碼圖文展示給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07

