精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript內存管理介紹

開發 前端
大多數時候,我們在不了解有關內存管理的知識下也只開發,因為 JS 引擎會為我們處理這個問題。不過,有時候我們會遇到內存泄漏之類的問題,這個只有知道內存分配是怎樣工作的,我們才能解決這些問題。

[[360753]]

本文已經過原作者Ahmad shaded 授權翻譯。

大多數時候,我們在不了解有關內存管理的知識下也只開發,因為 JS 引擎會為我們處理這個問題。不過,有時候我們會遇到內存泄漏之類的問題,這個只有知道內存分配是怎樣工作的,我們才能解決這些問題。

在本文中,主要介紹內存分配和垃圾回收的工作原理以及如何避免一些常見的內存泄漏問題。

緩存( Memory)生命周期

在 JS 中,當我們創建變量、函數或任何對象時,J S引擎會為此分配內存,并在不再需要時釋放它。

分配內存是在內存中保留空間的過程,而釋放內存則釋放空間,準備用于其他目的。

每次我們分配一個變量或創建一個函數時,該變量的存儲會經歷以下相同的階段:

 

分配內存

  • JS 會為我們處理這個問題:它分配我們創建對象所需的內存。

使用內存

  • 使用內存是我們在代碼中顯式地做的事情:對內存的讀寫其實就是對變量的讀寫。

釋放內存

  • 此步驟也由 JS 引擎處理,釋放分配的內存后,就可以將其用于新用途。

內存管理上下文中的“對象”不僅包括JS對象,還包括函數和函數作用域。

內存堆和堆

棧現在我們知道,對于我們在 JS 中定義的所有內容,引擎都會分配內存并在不再需要內存時將其釋放。

我想到的下一個問題是:這些東西將被儲存在哪里?

JS 引擎在兩個地方可以存儲數據:內存堆和堆棧。堆和堆棧是引擎是用于不同目的的兩個數據結構。

堆棧:靜態內存分配

 

堆棧是 JS 用于存儲靜態數據的數據結構。靜態數據是引擎在編譯時能知道大小的數據。在 JS 中,包括指向對象和函數的原始值(strings,number,boolean,undefined和null)和引用類型。

由于引擎知道大小不會改變,因此它將為每個值分配固定數量的內存。

在執行之前立即分配內存的過程稱為靜態內存分配。這些值和整個堆棧的限制取決于瀏覽器。

堆:動態內存分配

堆是另一個存儲數據的空間,JS 在其中存儲對象和函數。

與堆棧不同,JS 引擎不會為這些對象分配固定數量的內存,而根據需要分配空間。這種分配內存的方式也稱為動態內存分配。

下面將對這兩個存儲的特性進行比較:

堆棧
存放基本類型和引用
大小在編譯時已知
分配固定數量的內存
對象和函數
在運行時才知道大小
沒怎么限制

事例

來幾個事例,加強一下映像。

  1. const person = { 
  2.   name'John'
  3.   age: 24, 
  4. }; 

JS 在堆中為這個對象分配內存。實際值仍然是原始值,這就是它們存儲在堆棧中的原因。

  1. const hobbies = ['hiking''reading']; 

數組也是對象,這就是為什么它們存儲在堆中的原因。

  1. let name = 'John'; // 為字符串分配內存 
  2. const age = 24; // 為字分配內存 
  3.  
  4. name = 'John Doe'; // 為新字符串分配內存 
  5. const firstName = name.slice(0,4); // 為新字符串分配內存 

始值是不可變的,所以 JS 不會更改原始值,而是創建一個新值。

JavaScript 中的引用

所有變量首先指向堆棧。如果是非原始值,則堆棧包含對堆中對象的引用。

堆的內存沒有按特定的方式排序,所以我們需要在堆棧中保留對其的引用。我們可以將引用視為地址,并將堆中的對象視為這些地址所屬的房屋。

請記住,JS 將對象和函數存儲在堆中。基本類型和引用存儲在堆棧中。

 

這張照片中,我們可以觀察到如何存儲不同的值。注意person和newPerson都如何指向同一對象。

事例

  1. const person = { 
  2.   name'John'
  3.   age: 24, 
  4. }; 

這將在堆中創建一個新對象,并在堆棧中創建對該對象的引用。

垃圾回收

現在,我們知道 JS 如何為各種對象分配內存,但是在內存生命周期,還有最后一步:釋放內存。

就像內存分配一樣,JavaScript引擎也為我們處理這一步驟。更具體地說,垃圾收集器負責此工作。

一旦 JS 引擎識別變量或函數不在被需要時,它就會釋放它所占用的內存。

這樣做的主要問題是,是否仍然需要一些內存是一個無法確定的問題,這意味著不可能有一種算法能夠在不再需要那一刻立即收集不再需要的所有內存。

一些算法可以很好地解決這個問題。我將在本節中討論最常用的方法:引用計數和標記清除算法。

引用計數

當聲明了一個變量并將一個引用類型值賦值該變量時,則這個值的引用次數就是1。如果同一個值又被賦給另外一個變量,則該值得引用次數加1。相反,如果包含對這個值引用的變量又取 得了另外一個值,則這個值的引用次數減1。

當這個值的引用次數變成 0時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。這樣,當垃圾收集器下次再運行時,它就會釋放那 些引用次數為零的值所占用的內存。

我們看下面的例子。

 

請注意,在最后一幀中,只有hobbies留在堆中的,因為最后引用的是對象。

周期數

引用計數算法的問題在于它不考慮循環引用。當一個或多個對象互相引用但無法再通過代碼訪問它們時,就會發生這種情況。

  1. let son = { 
  2.   name'John'
  3. }; 
  4.  
  5. let dad = { 
  6.   name'Johnson'
  7.  
  8. son.dad = dad; 
  9. dad.son = son; 
  10.  
  11. son = null
  12. dad = null

 

由于父對象相互引用,因此該算法不會釋放分配的內存,我們再也無法訪問這兩個對象。

它們設置為null不會使引用計數算法識別出它們不再被使用,因為它們都有傳入的引用。

標記清除

標記清除算法對循環依賴性有解決方案。它檢測到是否可以從root 對象訪問它們,而不是簡單地計算對給定對象的引用。

瀏覽器的root是window 對象,而NodeJS中的root是global。

 

該算法將無法訪問的對象標記為垃圾,然后對其進行掃描(收集)。根對象將永遠不會被收集。

這樣,循環依賴關系就不再是問題了。在前面的示例中,dad對象和son對象都不能從根訪問。因此,它們都將被標記為垃圾并被收集。

自2012年以來,該算法已在所有現代瀏覽器中實現。僅對性能和實現進行了改進,算法的核心思想還是一樣的。

折衷

自動垃圾收集使我們可以專注于構建應用程序,而不用浪費時間進行內存管理。但是,我們需要權衡取舍。

內存使用

由于算法無法確切知道什么時候不再需要內存,JS 應用程序可能會使用比實際需要更多的內存。

即使將對象標記為垃圾,也要由垃圾收集器來決定何時以及是否將收集分配的內存。

如果你希望應用程序盡可能提高內存效率,那么最好使用低級語言。但是請記住,這需要權衡取舍。

性能

收集垃圾的算法通常會定期運行以清理未使用的對象。

問題是我們開發人員不知道何時會回收。收集大量垃圾或頻繁收集垃圾可能會影響性能。然而,用戶或開發人員通常不會注意到這種影響。

內存泄漏

在全局變量中存儲數據,最常見內存問題可能是內存泄漏。

在瀏覽器的 JS 中,如果省略var,const或let,則變量會被加到window對象中。

  1. users = getUsers(); 

在嚴格模式下可以避免這種情況。

除了意外地將變量添加到根目錄之外,在許多情況下,我們需要這樣來使用全局變量,但是一旦不需要時,要記得手動的把它釋放了。

釋放它很簡單,把 null 給它就行了。

  1. window.users = null

被遺忘的計時器和回調

忘記計時器和回調可以使我們的應用程序的內存使用量增加。特別是在單頁應用程序(SPA)中,在動態添加事件偵聽器和回調時必須小心。

被遺忘的計時器

  1. const object = {}; 
  2. const intervalId = setInterval(function() { 
  3.   // 這里使用的所有東西都無法收集直到清除`setInterval` 
  4.   doSomething(object); 
  5. }, 2000); 

上面的代碼每2秒運行一次該函數。如果我們的項目中有這樣的代碼,很有可能不需要一直運行它。

只要setInterval沒有被取消,則其中的引用對象就不會被垃圾回收。

確保在不再需要時清除它。

  1. clearInterval(intervalId); 

被遺忘的回調

假設我們向按鈕添加了onclick偵聽器,之后該按鈕將被刪除。舊的瀏覽器無法收集偵聽器,但是如今,這不再是問題。

不過,當我們不再需要事件偵聽器時,刪除它們仍然是一個好的做法。

  1. const element = document.getElementById('button'); 
  2. const onClick = () => alert('hi'); 
  3.  
  4. element.addEventListener('click', onClick); 
  5.  
  6. element.removeEventListener('click', onClick); 
  7. element.parentNode.removeChild(element); 

脫離DOM引用

內存泄漏與前面的內存泄漏類似:它發生在用 JS 存儲DOM元素時。

  1. const elements = []; 
  2. const element = document.getElementById('button'); 
  3. elements.push(element); 
  4.  
  5. function removeAllElements() { 
  6.   elements.forEach((item) => { 
  7.     document.body.removeChild(document.getElementById(item.id)) 
  8.   }); 

刪除這些元素時,我們還需要確保也從數組中刪除該元素。否則,將無法收集這些DOM元素。

  1. const elements = []; 
  2. const element = document.getElementById('button'); 
  3. elements.push(element); 
  4.  
  5. function removeAllElements() { 
  6.   elements.forEach((item, index) => { 
  7.     document.body.removeChild(document.getElementById(item.id)); 
  8.     elements.splice(index, 1); 
  9.   }); 

由于每個DOM元素也保留對其父節點的引用,因此可以防止垃圾收集器收集元素的父元素和子元素。

總結在本文中,我們總結了 JS 中內存管理的核心概念。寫這篇文章可以幫助我們理清一些我們不完全理解的概念。

希望這篇對你有所幫助,我們下期再見,記得三連哦!

作者:Ahmad shaded 譯者:前端小智 來源:felixgerschau

 

原文:https://felixgerschau.com/javascript-memory-management/

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2021-04-28 11:20:39

Python內存代碼

2024-04-10 13:59:44

JavaScript內存

2021-01-07 07:53:10

JavaScript內存管理

2009-06-16 11:11:07

Java內存管理Java內存泄漏

2013-07-19 13:16:26

iOS中BlockiOS開發學習內存管理

2023-02-20 15:27:30

開發JavaScript內存管理

2019-06-24 19:00:09

JavaScript內存泄漏垃圾回收

2025-07-23 07:40:29

2013-10-11 17:32:18

Linux運維內存管理

2018-07-23 09:26:08

iOS內存優化

2016-10-12 11:08:16

JavaScriptarguments數組

2023-10-18 13:31:00

Linux內存

2020-06-08 09:18:59

JavaScript開發技術

2021-08-05 15:28:22

JS內存泄漏

2011-04-14 09:27:37

內存數據庫

2011-06-21 14:25:44

JavaScriptcookie

2009-06-10 22:03:40

JavaScript內IE內存泄漏

2021-05-31 10:03:52

虛擬內存管理

2011-06-28 15:37:34

Qt 內存

2021-03-02 08:34:35

分布式管理設計
點贊
收藏

51CTO技術棧公眾號

av污在线观看| 亚洲最新在线| 欧美一区免费看| 成人同人动漫免费观看| 91精品久久久久久蜜臀| 女人帮男人橹视频播放| 欧美一区二区少妇| 青青青伊人色综合久久| 欧美疯狂xxxx大交乱88av| 黄色av网址在线观看| 主播大秀视频在线观看一区二区| 亚洲色欲色欲www| 久久影院理伦片| 国产精品爽爽久久久久久| 99re国产精品| xxx一区二区| 国产福利短视频| 韩国三级成人在线| 91黄视频在线| 久艹在线免费观看| 日韩伦理在线电影| 久久久国际精品| 成人免费看片网址| 亚洲无码精品在线播放| 国产精品久久久亚洲一区| 成年人精品视频| 亚洲图片另类小说| 国产毛片精品| 日韩一区二区在线看| www.欧美日本| 午夜不卡影院| 婷婷中文字幕一区三区| 色哺乳xxxxhd奶水米仓惠香| 黄色在线网站| 91视频一区二区| 国产高清不卡av| 99热精品在线播放| 免费美女久久99| 91精品国产91久久久久久久久 | 91成人小视频| 在线观看一区二区视频| 国产黄色一级网站| 丁香花视频在线观看| 亚洲美女精品一区| 亚洲综合欧美日韩| 三区四区电影在线观看| 日本一区二区成人| 日本高清一区| 国产人成在线视频| 久久久亚洲高清| 农村寡妇一区二区三区| 天天射,天天干| 成人h精品动漫一区二区三区| 2022国产精品| 北条麻妃一二三区| 国产精品77777竹菊影视小说| 国产精品视频一区二区三区四| 日韩精品久久久久久免费| 一区二区三区四区五区精品视频| 久久久女人电视剧免费播放下载| 久久黄色小视频| 136国产福利精品导航网址| 欧美高清自拍一区| 国产一卡二卡在线| 亚洲自啪免费| 国产精品69精品一区二区三区| 老熟妇一区二区三区| 视频一区二区国产| 国产精品吴梦梦| 99久久精品无免国产免费| 国产精品综合av一区二区国产馆| 亚洲影视九九影院在线观看| www.色日本| 不卡影院免费观看| 免费看污久久久| 成a人v在线播放| 国产精品高潮呻吟| 爱爱爱视频网站| 色婷婷av在线| 欧美色视频日本版| 性欧美极品xxxx欧美一区二区| 欧美成人aaa| 日韩欧美中文字幕公布| 好男人香蕉影院| 国产一区网站| 美女精品久久久| 国产无遮挡裸体免费视频| 久久动漫亚洲| 国产一区欧美二区三区| 精品国产99久久久久久宅男i| 成人丝袜18视频在线观看| 久久久影院一区二区三区| av资源网在线观看| 一区二区久久久| 日韩精品一区二区三区色欲av| 欧美一级网址| 亚洲激情在线观看| 午夜激情福利电影| 亚洲精品三级| 成人中心免费视频| 日韩精品123| 亚洲美女在线一区| 欧美日韩一区二区在线免费观看 | 亚洲福利专区| 国产精品美女久久| 日韩一级片免费在线观看| 欧美经典一区二区三区| 日本欧美视频在线观看| 欧美黄页在线免费观看| 日韩电视剧在线观看免费网站| 国产主播av在线| 日韩视频一区| 亚洲va欧美va国产综合久久| 欧美孕妇孕交| 亚洲国产视频a| 91丨九色丨蝌蚪| 久久最新网址| 久久久亚洲欧洲日产国码aⅴ| 亚洲中文字幕在线观看| 2022国产精品视频| 男人添女荫道口女人有什么感觉| 91精品店在线| 亚洲女人天堂色在线7777| 欧美黄色免费看| 久久成人免费日本黄色| 乱一区二区三区在线播放| 日本天码aⅴ片在线电影网站| 欧美午夜精品一区二区三区| 中文字幕在线永久| 欧美日韩福利| 91久久精品视频| 午夜在线播放| 欧美性色综合网| 99久久久无码国产精品性| 黄色工厂这里只有精品| 91国产在线播放| 毛片在线看网站| 欧美日韩一区二区三区视频| 少妇久久久久久久久久| 一本久道久久久| 国产精品久久久一区二区三区| 1区2区在线观看| 91精品免费在线| 亚洲一级生活片| 国产一区二区三区美女| 亚洲一区二区三区精品视频| 精品网站在线| 国产一区二区三区四区福利| 无码人妻av免费一区二区三区| 99免费精品在线| 国产中文字幕视频在线观看| 欧美人妖在线观看| 51久久精品夜色国产麻豆| 日本精品久久久久| 婷婷亚洲久悠悠色悠在线播放| 日韩av手机在线播放| 亚洲黑丝一区二区| 久久久99爱| 不卡av影片| 国产一区二区三区视频在线观看| 日批视频免费观看| 国产精品传媒在线| theporn国产精品| 欧美日韩综合| 黄色99视频| 亚洲第一二三四区| 色悠悠久久88| 亚洲国产一二三区| 午夜电影网一区| 亚洲制服丝袜在线播放| 久久婷婷激情| 国产精品美女在线播放| 日韩成人精品| 1769国内精品视频在线播放| 国产在线观看免费网站| 欧美三级午夜理伦三级中视频| www.99re6| 成人中文字幕在线| 久久久久国产精品熟女影院| 99热国内精品| 国产精选一区二区| 日韩电影免费观| 日韩视频免费中文字幕| 黄色一级大片在线免费看国产一| 黑人巨大精品欧美一区二区三区| 国产黄色大片免费看| 国产乱码精品一区二区三区五月婷| 欧美午夜小视频| 精品国产一区二区三区| 99热99热| 日本综合久久| 欧美激情国内偷拍| 国产小视频在线| 日韩精品中文字幕一区二区三区 | 日韩欧美色综合网站| 国产福利拍拍拍| 国产精品视频免费看| 成人三级做爰av| 天堂成人免费av电影一区| 综合网五月天| 在线看成人短视频| 亚洲自拍偷拍色片视频| 成人性生交大片免费网站| 日韩视频第一页| 狠狠狠综合7777久夜色撩人| 欧美福利电影网| 久草手机在线视频| 一区二区三区在线播放| 色婷婷在线影院| 成人听书哪个软件好| xx欧美撒尿嘘撒尿xx| 日韩视频在线一区二区三区 | 精品中文字幕人| 国产中文欧美日韩在线| 国产91在线播放九色快色| 久操av在线| 久久香蕉国产线看观看网| 四虎在线观看| 精品精品国产高清a毛片牛牛 | 亚洲欧洲二区| 日本在线观看天堂男亚洲| 成人在线高清免费| 超碰91人人草人人干| 在线观看国产原创自拍视频| 国产视频亚洲视频| 色一情一乱一区二区三区| 日韩一级大片在线| 国产影视一区二区| 欧美性淫爽ww久久久久无| 九九精品免费视频| 亚洲成年人影院| 久草免费新视频| 亚洲乱码一区二区三区在线观看| 亚洲第一视频区| 国产亚洲短视频| 在线观看日韩精品视频| 不卡一区二区在线| 911亚洲精选| 国产999精品久久久久久| 男生和女生一起差差差视频| 精品一区二区三区在线观看| 久久婷五月综合| 日日夜夜免费精品| 少妇人妻互换不带套| 久久亚洲综合| 任你操这里只有精品| 日韩专区欧美专区| 少妇黄色一级片| 九九国产精品视频| 婷婷激情小说网| 国产麻豆视频一区二区| 又黄又爽又色的视频| 国产精品亚洲а∨天堂免在线| av在线网站免费观看| 精品一区二区日韩| 国产三级精品三级在线| 国产精品99久久久久久宅男| 日韩欧美中文在线视频| 国产91精品在线观看| 69xxx免费视频| 99久久久国产精品| 亚洲第一页av| 国产欧美精品日韩区二区麻豆天美| 亚洲ⅴ国产v天堂a无码二区| 国产精品久久一卡二卡| 欧洲第一无人区观看| 樱桃视频在线观看一区| 国产一级特黄aaa大片| 欧美日韩国产在线播放| 中文字幕亚洲乱码熟女1区2区| 色噜噜狠狠成人中文综合| 中文字幕一区二区三区人妻四季 | 黄色91在线观看| 天天爱天天做天天爽| 欧美日韩另类一区| 朝桐光av在线一区二区三区| 亚洲国内精品在线| a中文在线播放| 欧美大尺度在线观看| heyzo高清在线| 国产成人精品一区二区| av日韩久久| 国产视色精品亚洲一区二区| 黑人操亚洲人| 久久视频免费在线| 欧美一级一区| 永久免费黄色片| 99精品欧美一区二区三区小说| 韩国女同性做爰三级| 亚洲精品国产无天堂网2021| 久久久久久久极品| 欧美剧情电影在线观看完整版免费励志电影 | 99日韩精品| 亚洲美女性囗交| 91色porny| 一区二区在线观看免费视频| 精品欧美激情精品一区| 国产理论视频在线观看| 日韩精品一区二区视频| 日本电影在线观看网站| 欧美性做爰毛片| 欧美午夜网站| 日本成人三级| 在线精品一区| 韩国一区二区在线播放| 久久久美女艺术照精彩视频福利播放| 亚洲综合网在线| 91精品1区2区| 亚洲aⅴ乱码精品成人区| 久久影院免费观看| 韩国精品主播一区二区在线观看 | 污污网站免费在线观看| 久久激情五月丁香伊人| 亚洲欧美韩国| eeuss一区二区三区| 色喇叭免费久久综合网| 噜噜噜久久亚洲精品国产品麻豆| 国产伦精一区二区三区| 91资源在线播放| 欧美日韩中文字幕综合视频| 亚洲精品久久久蜜桃动漫| 日韩午夜在线视频| 欧美成人app| 欧美美乳视频网站在线观看| 亚洲手机在线| wwwww在线观看| 亚洲欧美另类小说| 亚洲图片在线播放| 中文字幕日韩欧美| 日韩欧美看国产| 久久久99爱| 亚洲专区一区二区三区| 黄色av网址在线观看| 偷偷要91色婷婷| 肥臀熟女一区二区三区| 欧美理论片在线观看| 国产精品亚洲综合在线观看| 亚洲一区二区三区乱码| 青青草97国产精品免费观看 | 欧美亚洲在线日韩| 777米奇影视第四色| 91香蕉视频在线| 黄色片视频网站| 亚洲精品福利免费在线观看| 1234区中文字幕在线观看| 国产嫩草一区二区三区在线观看| 在线看片一区| 日本黄色动态图| 图片区小说区区亚洲影院| 三级无遮挡在线观看| 青青精品视频播放| 精品国精品国产自在久国产应用| 可以免费在线看黄的网站| 久久精品欧美日韩精品| 日韩av免费播放| 视频一区视频二区国产精品| 国产精品亚洲成在人线| 一区二区三区久久网| 国产伦精品一区二区三区免费| 三级影片在线看| 日韩精品一区二区三区老鸭窝 | 国产精品91在线| 久久五月天小说| 一区二区三区人妻| 亚洲成人手机在线| 裸体xxxx视频在线| 国产精品自拍偷拍视频| 亚洲激情五月| 欧美大喷水吹潮合集在线观看| 欧美三级xxx| 欧美激情视频在线播放| 国产精品久久久久久久天堂第1集| 99精品欧美| 精品人体无码一区二区三区| 91精品一区二区三区久久久久久 | 91成人网在线| 国产淫片在线观看| av日韩免费电影| 午夜亚洲伦理| 免费在线黄色网| 中文字幕免费不卡| 久久撸在线视频| 欧美激情在线一区二区| www日本高清| 午夜免费日韩视频| 国产农村妇女毛片精品久久| 国产一区二区三区在线观看视频| www.久久99| 日韩精品一区二区三区久久| 中文字幕一区视频| 天堂av中文字幕| 国产伊人精品在线| 夜夜嗨网站十八久久| 少妇的滋味中文字幕bd| 欧美一级高清片| 四虎成人在线| 国产高清av在线播放| 国产精品国产自产拍在线| 日韩在线观看视频一区二区三区| 国产精品免费一区|