激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - JavaScript的垃圾回收機制與內存管理

JavaScript的垃圾回收機制與內存管理

2021-08-09 16:56Lpyexplore JavaScript

這篇文章主要介紹了JavaScript的垃圾回收機制與內存管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

如果我們想要優化性能,首先我們必須得了解JavaScript中的垃圾回收機制,這樣可以將很多沒有被使用到的變量從內存中清除掉,騰出更多的內存空間,給別的變量分配內存空間。

JavaScript中的垃圾回收機制

引言

本篇文章將講解一下javascript的垃圾回收機制。同時,我們必須先具備作用域鏈的概念,不懂的小伙伴可以先花5分鐘觀看一下這篇文章,簡單了解一下作用域鏈的知識——從零開始講解JavaScript中作用域鏈的概念及用途

正文

一、垃圾回收機制

在JavaScript中,具有自動垃圾回收機制,也就是說執行環境會自動負責管理代碼執行過程中的內存使用情況,會自動清除一些沒有用的變量,以此來釋放內存。該機制每隔一段時間會執行一次。

例如下面這段代碼,函數 change 在執行時,聲明了一個局部變量my_color,然后等函數執行完畢以后,這個局部變量也沒有作用了,所以這時垃圾回收機制就會將這個沒用的的局部變量my_color給清除掉。

?
1
2
3
4
5
6
7
8
let color = 'red'
 
function change() {
    let my_color = 'blue'
    color = 'green'
}
 
change()

JavaScript中能實現這樣的垃圾回收的功能的一共有兩種方式: 標記清除 、引用計數

(1)標記清除

標記清除是JavaScript中最常用的垃圾回收方式。它的實現方式是這樣的,當代碼執行在一個環境中時,每聲明一個變量,就會對該變量做一個標記,例如標記一個進入執行環境;當代碼執行進入另一個環境中時,也就是說要離開上一個環境,這時對上一個環境中的變量做一個標記,例如標記一個離開執行環境,等到垃圾回收執行時,會根據標記來決定要清除哪些變量。

(2)引用計數

引用計數是一種不太常用的垃圾回收方式。顧名思義,就是針對值為引用類型數據的變量進行計數,那么我們先來看一下以下這個例子,來理解一下這個方式的實現方式

?
1
2
3
4
5
6
7
8
9
10
let color = [1, 2, 3]
 
function change() {
    let new_color = [4, 5, 6]
    color = new_color
}
 
change()
 
console.log(color) //返回 [4, 5, 6]

這個例子中的函數change內部聲明了一個變量new_color,并將一個引用類型值賦值給它,同時又將變量new_color賦值給了全局變量color,那么這種情況下,這個局部變量new_color就不會被當成垃圾回收了,因為此時的變量new_color并不是一個無用的局部變量了,它被全局變量color所引用了。

那么為什么變量new_color不會被當成垃圾回收呢?其實引用計數的垃圾回收方式是這樣的,當聲明一個變量時,會給該變量設定一個值為0的引用次數,當該變量被別的變量所引用,就將引用次數+1,若取消了原本的引用,則引用次數-1,而垃圾回收機制就是判斷一個變量的值的引用數是否為0,如果為0,就被當成無用變量給回收掉,如果不為0,則不對該變量做任何的處理。

二、管理內存

有時我們需要手動管理一下內存的分配和清除,應該很好理解,如果有更大的內存空間,因為可以給更多的變量分配內存,就會提高代碼運行的效率,增加線程中能夠執行的代碼語句的數量。

所以我們要確保占用更少的內存使得頁面獲得更好的性能,就可以只將需要用到的數據保存到變量中,一旦數據不再使用,我們可以通過給變量賦值null來釋放數據的引用,這種方法就叫做解除引用。這種方法大多數是用于全局變量,因為局部變量一般在離開環境以后就會被自動清除。

我們來改變一下上面這個例子,使得變量new_color被引用完后,當成無用變量給清除掉

?
1
2
3
4
5
6
7
8
9
10
11
12
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

在這個例子中,函數change內部聲明的變量new_color被全局變量color所引用,所以此時變量new_color的引用次數為1,我們為了讓變量new_color被清除,所以在代碼的最后一行,賦值一個null給全局變量color,手動解除了變量color對變量new_color的引用,此時變量new_color的引用次數-1,所以啊當前它的引用次數為0了。當垃圾回收機制執行的時候,發現它的引用次數為0,就把該變量當成無用變量給清除了,釋放了內存。

結束語

理解了js的垃圾回收機制,我們才能修改代碼對性能進行優化 。好了,JavaScript的垃圾回收機制的講解就講到這里,希望對大家有所幫助。

我是前端Lpyexplore,原創不易,喜歡我的文章的點個關注,甩個贊,不嫌麻煩的評論支持一下,謝謝大家啦~

到此這篇關于JavaScript的垃圾回收機制與內存管理的文章就介紹到這了,更多相關JavaScript的垃圾回收機制內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/l_ppp/article/details/106858295

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲最大中文字幕 | 久久精品亚洲一区二区 | 最新一区二区三区 | 午夜精品毛片 | 亚洲成人黄色片 | 久久久久国产一区二区三区不卡 | 国产美女视频一区二区三区 | 双性精h调教灌尿打屁股的文案 | 97香蕉超级碰碰久久免费软件 | 少妇一级淫片免费放正片 | 看片一区二区三区 | 外国一级黄色片 | 色视频在线观看 | 久久久久久久久久91 | 久久免费综合视频 | 中国av免费观看 | 久久久久久亚洲综合影院红桃 | 精品伊人| 亚州综合| 久草在线精品观看 | av在线日韩 | 爽爽视频免费看 | 爽爽淫人综合网网站 | 草草在线观看 | 万圣街在线观看免费完整版 | 最新se94se在线欧美 | 久久久久久久一区 | 草莓福利社区在线 | 蜜桃视频在线观看视频 | www.99av| 久久精品站 | 成人9禁啪啪无遮挡免费 | 国产九色91| 日日夜av| 久久精品视频网站 | 成人免费看片a | av手机免费在线观看 | 亚洲5区 | 好吊一区二区三区 | 性欧美videos另类极品 | 亚洲视频欧美 |