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

聊聊JavaScript內存管理

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

[[374270]]

本文已經過原作者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/

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

 

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

2022-11-28 07:21:53

操作系統內存管理

2024-04-10 13:59:44

JavaScript內存

2020-12-29 08:09:25

JavaScript內存管理

2021-03-28 13:54:31

操作系統內存管理

2021-10-17 22:40:51

JavaScript開發 框架

2022-02-09 11:02:16

JavaScript前端框架

2021-06-02 09:01:19

JavaScript 前端異步編程

2019-07-23 15:04:54

JavaScript調用棧事件循環

2023-10-31 21:03:49

宿主機管理云開發

2022-11-30 08:19:15

內存分配Go逃逸分析

2019-07-11 15:43:44

KVMKSM內存

2021-08-16 06:56:21

Slice數組類型內存

2021-12-16 06:52:33

C語言內存分配

2020-05-09 13:49:00

內存空間垃圾

2021-09-06 08:26:08

JavaScript數獨 LeetCode

2022-02-23 09:03:29

JavaScript開發命名約定

2021-09-08 08:55:45

Javascript 高階函數前端

2022-11-07 08:01:18

Git分支管理

2023-12-02 20:41:32

內存kube

2024-11-22 00:09:15

點贊
收藏

51CTO技術棧公眾號

久久久久美女| 欧美无人区码suv| 六月婷婷综合网| 国产精品一卡| 日韩亚洲欧美中文在线| 欧美69精品久久久久久不卡| 国产99在线| 五月激情久久| 91色视频在线| 92国产精品久久久久首页| 日操夜操天天操| 欧洲视频一区| 日韩女优毛片在线| 密臀av一区二区三区| 怡红院av在线| 亚洲国产精品黑人久久久| 91影院未满十八岁禁止入内| 亚洲天堂五月天| 欧美午夜不卡| 中文字幕一区二区三区在线播放| 97香蕉超级碰碰久久免费软件| 欧美熟妇一区二区| 韩国精品一区| 国产精品人妖ts系列视频| 国产精品国产三级欧美二区| 国产探花在线播放| 一区二区三区视频免费观看| 天天综合天天做天天综合| 亚洲成人自拍| 日本一区二区三区在线观看视频| 好看的日韩av电影| 啊v视频在线一区二区三区 | 亚洲激情视频在线| 亚洲精品手机在线观看| 丁香六月综合| 疯狂欧美牲乱大交777| 国产精品视频免费一区| 国产精品久久久久精| 老牛嫩草一区二区三区日本 | 欧美卡一卡二卡三| 久久中文字幕二区| 亚洲性视频网址| 国产精品无码永久免费不卡| 蜜桃视频m3u8在线观看| 91免费视频大全| 99热国产免费| 99久久婷婷国产一区二区三区| 美女视频一区二区三区| 久久精品国产v日韩v亚洲| 国产精品扒开腿做爽爽| 日日狠狠久久偷偷综合色| 欧美va在线播放| 国产伦精品一区二区三区妓女下载| 欧美黄色网络| 在线观看91精品国产麻豆| 永久免费网站视频在线观看| 中国日本在线视频中文字幕| 国产欧美在线观看一区| 区一区二区三区中文字幕| 青青草免费在线| 久久综合久色欧美综合狠狠| 欧美h视频在线| 撸视在线观看免费视频| 久久久久久久性| 成人欧美在线视频| a在线观看免费| 国产成人免费在线视频| 波多野结衣久草一区| 丰满岳乱妇国产精品一区| 国产91露脸合集magnet| 国产精品国模大尺度私拍| 免费观看a视频| 日韩av在线播放中文字幕| 国产成人鲁鲁免费视频a| 最新国产中文字幕| 国内精品久久久久影院色| 91香蕉嫩草影院入口| 亚洲国产剧情在线观看| 91蝌蚪porny成人天涯| 日本不卡久久| 国产在线观看免费麻豆| 亚洲一级二级在线| 国产91对白刺激露脸在线观看| 亚洲www.| 欧美一区二区大片| 久久久久久久久久婷婷| 国产一级免费大片| 国产精品xxxav免费视频| 亚洲九九九在线观看| 亚洲av综合一区二区| 色呦哟—国产精品| 久久久免费观看| 中文字幕国产在线观看| 国产最新精品精品你懂的| 国产精品加勒比| 99免在线观看免费视频高清| 一区二区三区精品在线| 免费黄色福利视频| av日韩久久| 欧美日韩一区二区免费视频| 一区二区三区免费播放| 亚洲国产精品免费视频| 亚洲男人天堂九九视频| 天天操天天操天天操天天操天天操| 亚洲大片av| 国产日韩在线视频| 国产一级片一区二区| 国内精品免费**视频| 欧美日韩精品免费看| av网站导航在线观看免费| 欧美视频一二三| 日本中文字幕精品| 日韩欧美午夜| 4444欧美成人kkkk| www.av黄色| 国产精品日韩精品欧美在线| 国产91在线视频观看| 国模大尺度视频一区二区| 亚洲欧美制服综合另类| 久久久久亚洲天堂| 久久精品国产第一区二区三区| 国产精品美女视频网站| 日韩一级片免费在线观看| 国产精品的网站| 欧美激情成人网| 国产精品天天看天天狠| 久久视频在线视频| 最新中文字幕免费| 久久蜜桃av一区二区天堂| 欧美日韩福利在线| 视频一区日韩精品| 久久激情视频免费观看| 特级西西444www大胆免费看| 91伊人久久大香线蕉| 欧美高清中文字幕| 国产高清中文字幕在线| 这里只有精品免费| 中文字幕黄色网址| 老司机精品福利视频| 精品一区二区不卡| av电影免费在线看| 精品久久久久久综合日本欧美| 久久福利免费视频| 午夜精品网站| 91香蕉嫩草影院入口| 麻豆av在线免费看| 欧美久久一区二区| 中文字幕求饶的少妇| 日韩一区欧美二区| 亚洲自拍在线观看| 国产婷婷视频在线 | 一二区在线观看| 国产精品全国免费观看高清| 久热精品在线播放| 久久综合成人| 亚洲xxxx18| 午夜激情在线| 精品国产乱码久久久久久老虎| 久久精品国产亚洲AV无码男同| 国产一区91| 久久精品成人一区二区三区蜜臀| 美女在线视频免费| 亚洲人成在线免费观看| 日韩乱码一区二区三区| 国产精品久久久久aaaa| 免费黄频在线观看| 欧美在线首页| 国产在线精品二区| 婷婷激情一区| 日韩在线播放视频| 性一交一乱一乱一视频| 无码av免费一区二区三区试看| 国产精品无码专区| 天堂在线一区二区| 日本一区二区免费高清视频| 国产盗摄——sm在线视频| 日韩精品资源二区在线| 免费在线不卡视频| 久久精品网站免费观看| 永久免费的av网站| 欧美日本免费| 免费一区二区三区| 色8久久久久| 久久免费视频在线| 国产精品视频一区二区久久| 777久久久精品| 国产做受高潮漫动| 中文字幕成人网| 中文字幕在线观看视频www| 亚欧美中日韩视频| 在线视频不卡国产| 国产欧美自拍一区| 国产精品久久久久久亚洲调教| 在线āv视频| 亚洲欧洲免费视频| 国产av无码专区亚洲av| 欧美日韩国产精品一区二区三区四区| 亚洲精品91在线| 成人免费视频视频在线观看免费| 欧美一级裸体视频| 黄色av成人| 亚洲精品乱码视频| 高清欧美性猛交xxxx黑人猛| 国产精品一区二区三区在线播放| 欧美videossex另类| 永久免费毛片在线播放不卡| 蜜臀av午夜精品| 欧美日韩视频专区在线播放| 美国黄色a级片| 久久成人免费网站| 精品久久久久久久久久中文字幕| 97精品国产| 欧美精品一区二区视频| 精品一区二区三区中文字幕在线 | av无码久久久久久不卡网站| 日本一二区不卡| 精品国产电影| 欧美黄视频在线观看| 国产精品视频区1| 毛片免费看不卡网站| 国内精品伊人久久| 性欧美高清come| 色爱av美腿丝袜综合粉嫩av| 日韩欧美亚洲系列| 亚洲第一男人av| 性生交生活影碟片| 91精品国产综合久久精品| 中文无码av一区二区三区| 欧美丝袜一区二区三区| 国产一级在线视频| 一区二区三区在线免费观看 | 久久久久久久久久久妇女| 欧美一进一出视频| 天天操综合520| 好吊色欧美一区二区三区四区| 日韩成人视屏| 亚洲最大福利视频| 日本一区二区三区视频在线看 | 日本高清免费在线视频| 日韩不卡一区二区三区 | 国产麻豆视频一区二区| 日本在线播放一区二区| 久久精品国产77777蜜臀| 特级丰满少妇一级| 免费精品视频最新在线| 美女网站视频黄色| 青青草国产精品97视觉盛宴| 国产成人无码av在线播放dvd| 翔田千里一区二区| 国产淫片av片久久久久久| 久久xxxx| 91欧美视频在线| 精品在线免费视频| 一级黄色大片儿| 国产电影精品久久禁18| 久久久男人的天堂| 成人黄色综合网站| 国产精品久久不卡| 久久一区二区视频| 一级片视频免费看| 国产精品久99| 男人的天堂久久久| 亚洲成人综合在线| 国产精品久久久久久久久久久久久久久久久| 亚洲电影中文字幕在线观看| 99热只有这里有精品| 91久久精品国产91性色tv| 一级黄色片免费看| 欧美r级电影在线观看| 五月婷婷丁香花| 欧美三级视频在线播放| 国产一区二区在线视频聊天 | 超碰中文字幕在线观看| 国产激情视频一区二区三区欧美 | 亚洲日韩欧美一区二区在线| 青娱乐国产在线视频| 五月天欧美精品| 波多野结衣在线观看视频| 在线91免费看| 天天综合网天天综合| 中文字幕视频一区二区在线有码| 国产网友自拍视频导航网站在线观看 | 欧美综合久久久| 国产免费不卡视频| 亚洲高清在线观看| 97视频在线观看网站| 欧美日本高清视频| 在线日本欧美| 成人免费看片网站| 国产一区二区三区日韩精品| 中文字幕av导航| 亚洲免费婷婷| 亚洲热在线视频| 久久精品男人天堂av| 欧美精品一区二区蜜桃| 色激情天天射综合网| 亚洲a视频在线观看| 夜夜嗨av色一区二区不卡| 污污视频在线看| 国产精品久久久久77777| 电影一区二区在线观看| 亚洲二区自拍| 国产视频一区三区| 亚洲av毛片在线观看| 欧美激情综合五月色丁香| 国产乱码久久久久久| 欧美日韩一区二区在线观看视频| 国产91免费在线观看| 精品国产欧美成人夜夜嗨| 成人欧美大片| 国产精品美女黄网| 天天射天天综合网| 欧美日韩成人一区| 超碰在线观看99| 色偷偷888欧美精品久久久| 伊人久久精品一区二区三区| 成人资源视频网站免费| 偷拍欧美精品| 日韩精品你懂的| 国产视频一区在线观看| 日韩精品一区二区在线播放| 91精品国产色综合久久| 在线观看免费网站黄| 欧洲亚洲女同hd| 久9re热视频这里只有精品| 一本二本三本亚洲码| 麻豆成人久久精品二区三区小说| 精品无码一区二区三区| 香蕉乱码成人久久天堂爱免费| 国产免费无遮挡| 日韩中文字幕av| 秋霞国产精品| 茄子视频成人在线观看 | 国产乱码精品一区二区亚洲| 国产美女在线一区| 高清不卡一区二区| 久久久久亚洲AV成人| 欧美裸体一区二区三区| av在线日韩国产精品| 国产精品露脸自拍| 欧洲毛片在线视频免费观看| 欧美在线观看视频网站| 国产亚洲制服色| 五月婷婷激情五月| 国产一区二区三区在线观看网站| 英国三级经典在线观看| 久久国产精品一区二区三区| 亚洲综合国产| 欧美老女人性生活视频| 欧美性淫爽ww久久久久无| 国产精品麻豆一区二区三区 | 欧美国产视频一区二区| 99这里只有精品视频| 国产一级爱c视频| 97久久精品人人做人人爽| 久久99精品波多结衣一区| 亚洲人成欧美中文字幕| 自拍偷自拍亚洲精品被多人伦好爽| 视频三区二区一区| 老司机一区二区| 午夜精品一区二区三区视频| 欧美成人r级一区二区三区| 成人免费观看在线观看| 欧美午夜精品久久久久免费视| 日韩成人一区二区| 国产高潮国产高潮久久久91| 日韩欧美的一区二区| 蜜桃视频在线观看免费视频| 欧洲成人一区二区| 毛片一区二区三区| 亚洲熟女www一区二区三区| 亚洲精品国产成人| 日本一区二区三区视频在线| 久久久一二三四| 成人av动漫在线| 中文字幕一区二区人妻视频| 日韩少妇与小伙激情| 国产劲爆久久| 成人免费毛片播放| 亚洲人一二三区| 亚洲人在线观看视频| 国产日韩中文在线| 黑人一区二区三区四区五区| 97超碰在线资源| 欧美一二三在线| 亚洲一区资源| 400部精品国偷自产在线观看| av亚洲产国偷v产偷v自拍| 在线视频 中文字幕| 久久久久久91香蕉国产| 欧美色就是色| 日韩国产小视频| 久久一区二区三区四区| 国产伦理吴梦梦伦理| 91福利视频在线观看| 亚洲91中文字幕无线码三区| 国产xxxx视频| 911国产精品| 电影一区二区三| 国产天堂视频在线观看|