精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美激情影院| 国产乱色在线观看| 免费亚洲婷婷| 少妇精69xxtheporn| 婷婷中文字幕在线观看| 丝袜在线观看| 久久久精品欧美丰满| 国产在线精品成人一区二区三区| 强制高潮抽搐sm调教高h| 荡女精品导航| 欧美色精品天天在线观看视频| 中国一级黄色录像| 秋霞网一区二区| 午夜亚洲性色视频| 久久国产精品视频| 久久精品女同亚洲女同13| 成人片免费看| 亚洲欧美一区二区不卡| 久久久久成人精品免费播放动漫| 国产午夜无码视频在线观看 | 国产精品草莓在线免费观看| 无码人妻精品中文字幕| 国偷自产av一区二区三区| 91久久奴性调教| www.国产二区| 国产福利片在线| 国产成人啪免费观看软件| 热久久免费国产视频| 精品丰满少妇一区二区三区| 999久久精品| 在线免费观看一区| www.亚洲视频.com| 日本中文在线| 91欧美一区二区| 国产精品一区二区三区毛片淫片| 欧美黑吊大战白妞| 亚洲va久久久噜噜噜久久| 日韩午夜精品视频| 黄色国产小视频| 调教一区二区| 中文字幕一区二区三区精华液 | 无遮挡又爽又刺激的视频| 97caopron在线视频| 久久久精品人体av艺术| 国产免费高清一区| 国产精品永久久久久久久久久| 国产精品亚洲综合色区韩国| 欧美日本国产在线| 国产又粗又长免费视频| 亚洲午夜久久| 亚洲国产成人在线播放| 国产精品熟女一区二区不卡| 成人教育av| 亚洲精品美腿丝袜| 先锋影音亚洲资源| 少妇无码一区二区三区| 国产呦萝稀缺另类资源| 国产欧美一区二区三区久久| 欧美精品一二三四区| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩专区在线观看| 四虎永久免费影院| 日本妇女一区| 亚洲国产成人av在线| 欧美图片自拍偷拍| 网站一区二区| 日韩欧美二区三区| 亚洲精品一二三四| 高清在线一区二区| 欧美一区二区三区在线观看| 四季av一区二区三区| 国产精品xxx| 欧美三级视频在线| 冲田杏梨av在线| 亚洲一区二区三区四区| 91久久国产综合久久| 国产一区亚洲二区三区| 在线人成日本视频| 一本色道久久综合狠狠躁的推荐| 亚洲 欧美 日韩 国产综合 在线| 女同一区二区免费aⅴ| 亚洲精品午夜久久久| 天天爱天天做天天操| 成人在线视频亚洲| 亚洲综合激情小说| 日韩国产成人无码av毛片| 日本高清成人vr专区| 夜夜嗨av一区二区三区四季av| 91视频成人免费| 暖暖在线中文免费日本| 天天亚洲美女在线视频| 国产欧美久久久久| heyzo在线| 日韩欧美中文第一页| 男人插女人下面免费视频| 久久国内精品| 日韩一区二区三区视频| 国产调教打屁股xxxx网站| 国产成人精品福利| 亚洲精品一区二区在线| 色噜噜噜噜噜噜| 91成人超碰| 精品中文字幕在线| 日本亚洲欧美在线| 亚洲女人av| 91美女片黄在线观| 草逼视频免费看| 91网址在线看| 一本久久a久久精品vr综合| 污视频网站在线免费| 色拍拍在线精品视频8848| 欧美成人福利在线观看| 在线观看视频一区二区三区| 国产视频精品久久久| 成年人二级毛片| 一区二区三区福利| 国产精品一二三视频| 亚洲精品一区二区三区不卡| 久久综合网色—综合色88| 综合久久国产| 校园春色亚洲| 在线综合亚洲欧美在线视频| 在线黄色免费网站| 99国产**精品****| 欧美在线亚洲一区| av网站免费播放| 国产日产欧美精品一区二区三区| 看全色黄大色大片| 电影亚洲一区| 日韩精品黄色网| 五月天av网站| 免费在线观看成人| 激情欧美一区二区三区中文字幕| 欧美jizzhd欧美| 亚洲一区二区三区四区在线观看| 一级特黄性色生活片| 看全色黄大色大片免费久久久| 亚洲欧美日韩精品久久奇米色影视| 手机在线免费看毛片| 蜜桃伊人久久| 国产美女在线精品免费观看| 国产最新在线| 色狠狠一区二区三区香蕉| 少妇性l交大片7724com| 青青草国产成人a∨下载安卓| 97久久精品在线| 亚洲爱爱综合网| 18成人在线观看| 超碰在线公开97| 天天躁日日躁成人字幕aⅴ| 色综合色综合久久综合频道88| 中文字幕制服诱惑| 国产偷v国产偷v亚洲高清| 久久国产精品网| 天堂va在线高清一区| 欧美成人久久久| 一区二区久久精品66国产精品| 国产日韩精品久久久| 成年人免费在线播放| 欧美一级色片| 高清视频欧美一级| 人人妻人人澡人人爽久久av| 亚洲一区二区欧美| 国产大尺度视频| 伊人精品成人久久综合软件| 亚洲xxxx视频| 99久久精品免费观看国产| 欧美日产在线观看| 欧美在线视频第一页| 国产麻豆日韩欧美久久| www.-级毛片线天内射视视| 日韩专区视频网站| 日韩亚洲欧美中文高清在线| 亚洲专区第一页| 国产精品夫妻自拍| 91精产国品一二三产区别沈先生| 99九九热只有国产精品| 成人黄色av网| 2021国产在线| 欧美成人激情免费网| 免费在线观看日韩| www.日韩av| 97在线播放视频| 精品日本12videosex| 国产精品久久久久久av福利| 91精品大全| 91精品国产91久久久久久一区二区| 精品国产视频在线观看| 国产电影精品久久禁18| 欧美一级视频在线播放| 成人搞黄视频| 国产精品久久久91| 暖暖日本在线观看| 精品裸体舞一区二区三区| 欧美一二三区视频| 日本一区二区三区四区在线视频| av在线网址导航| 国产精品theporn| 久久99导航| 久久国产三级| 国外成人在线视频| 国产三级视频在线看| 91精品综合久久久久久| 久久综合激情网| 久久免费视频色| 日韩成人精品视频在线观看| 国产精品av久久久久久麻豆网| 久久国产精品免费一区| 另类一区二区| 高清一区二区三区四区五区| 黄视频在线播放| 欧美精品久久99| 日本中文字幕在线| 日韩理论在线观看| 日韩 中文字幕| 国内成+人亚洲+欧美+综合在线| 免费一级淫片aaa片毛片a级| 欧美精美视频| 69堂成人精品视频免费| 日韩电影av| 欧美激情乱人伦| 99re在线视频| 日韩精品电影网| www.国产免费| 欧美在线色视频| 日韩av免费网址| 亚洲视频一二三| 白白色免费视频| 成人短视频下载 | 艳女tv在线观看国产一区| 岛国一区二区三区高清视频| 美女写真久久影院| 久久久免费高清电视剧观看| 欧美黑人激情| 亚洲小视频在线观看| 欧美一级片免费| 欧美一区二区视频网站| 国模私拍一区二区| 欧美日韩激情网| 久久免费黄色网址| 亚洲丝袜美腿综合| 中文字幕在线1| yourporn久久国产精品| 北条麻妃亚洲一区| 久久精品久久99精品久久| 91视频最新入口| 一本久道久久综合狠狠爱| 久久综合亚洲精品| 欧美.www| 懂色av粉嫩av蜜臀av| 99久久影视| 亚洲色图自拍| 日本一区二区在线看| 日产国产精品精品a∨| 日韩在线影视| 91九色在线观看| 91精品亚洲一区在线观看| 成人激情电影一区二区| 成人精品国产| 国产精品永久免费| 福利一区二区三区视频在线观看| 欧美一级免费视频| 在线最新版中文在线| 66m—66摸成人免费视频| jizz一区二区三区| 97超级碰在线看视频免费在线看| h片在线观看下载| 国外成人性视频| 国产拍在线视频| 91成人免费观看网站| 久久男人天堂| 欧美自拍大量在线观看| 蜜桃视频m3u8在线观看| 久久久亚洲影院| 国内小视频在线看| 午夜精品免费视频| 国产高清不卡| 国产精品嫩草影院久久久| www.成人在线视频| 91精品免费久久久久久久久| 成人精品视频在线观看| 成人综合av网| 夜色77av精品影院| 日韩亚洲视频在线| 99国产精品免费视频观看| 91成人在线视频观看| 在线看片日韩| 老太脱裤子让老头玩xxxxx| 香蕉视频成人在线观看| 99视频免费播放| 国产在线精品一区二区不卡了 | 久久精品99久久| 精品国产一区二区三区噜噜噜| 亚洲国产高清国产精品| 91精品1区| 一区二区传媒有限公司| 视频一区中文字幕国产| 欧美日韩精品区别| 成人福利视频在线看| 我想看黄色大片| 一区二区三区日韩精品| 国产又黄又爽又色| 色婷婷综合久久久久中文一区二区| 国产三级理论片| 欧美日产在线观看| 欧美特级特黄aaaaaa在线看| 伊人男人综合视频网| 污视频在线看网站| 日本久久久久久久| 经典三级久久| 免费看成人片| 午夜国产精品视频免费体验区| 自慰无码一区二区三区| 久久成人久久鬼色| 亚洲一区二区三区四区五区六区| 国产精品素人一区二区| 国产亚洲精品久久久久久无几年桃| 天天色综合成人网| 中文在线免费看视频| 欧美成人国产一区二区| aaa日本高清在线播放免费观看| 久久久久久久久久婷婷| 88xx成人网| 国产精品日韩一区二区三区| 日韩av自拍| 国产97在线 | 亚洲| 韩国成人在线视频| 在线免费观看麻豆| 一区二区不卡在线播放 | 欧美日韩一区成人| 天天综合网在线观看| 久久夜色精品亚洲噜噜国产mv| 樱桃视频成人在线观看| 97超级在线观看免费高清完整版电视剧| 你微笑时很美电视剧整集高清不卡| 国产一二三四五| 美国十次了思思久久精品导航| 欧美做受喷浆在线观看| 一区二区三区高清| 国产精品一区二区黑人巨大| 在线观看成人黄色| 女人天堂av在线播放| 国产精品老女人精品视频| 极品美女一区二区三区| 日本日本19xxxⅹhd乱影响| 高清成人免费视频| 69xx绿帽三人行| 欧美日韩你懂得| 成人性生交大片免费看午夜| 4k岛国日韩精品**专区| 成人黄色av网址| www.18av.com| 国产精品69久久久久水密桃| 天海翼在线视频| 欧美顶级少妇做爰| av色综合久久天堂av色综合在| 成人a在线视频| 91日韩免费| 亚洲男人天堂av在线| 国产精品麻豆久久久| 波多野结衣一区二区在线| 亚洲少妇中文在线| 欧美三级网址| 日韩精品国内| 人人精品人人爱| 超碰人人人人人人人| 欧美综合久久久| 国产激情视频在线观看| 亚洲a在线播放| 欧美在线国产| 亚洲色图欧美另类| 红桃av永久久久| 极品美乳网红视频免费在线观看| 日韩美女av在线免费观看| 国产一区二区区别| 精品久久久久久中文字幕2017| 亚洲国产精品激情在线观看| 中文字幕人妻色偷偷久久| 亚洲午夜小视频| 伊人久久一区| 韩国无码av片在线观看网站| 成人av午夜影院| 在线观看日本网站| 上原亚衣av一区二区三区| 自拍偷拍亚洲| 搞av.com| 久久久久久亚洲综合| 中文字幕乱码中文字幕| 中文字幕久热精品视频在线| 午夜激情成人网| 国产又粗又猛又爽又黄的网站| 不卡av在线免费观看| www.国产毛片| 久久亚洲影音av资源网| 牛牛影视一区二区三区免费看| 亚洲乱码国产一区三区| 亚洲色大成网站www久久九九| 国产 日韩 欧美 精品| 日本欧美精品在线| 自拍偷拍欧美专区|