JavaScript垃圾回收機制

一:內存-內存泄漏

程序的運行需要內存。只要程序提出要求养篓,操作系統(tǒng)或者運行時(runtime)就必須供給內存秃流。對于持續(xù)運行的服務進程(daemon),必須及時釋放不再用到的內存柳弄。否則舶胀,內存占用越來越高,輕則影響系統(tǒng)性能碧注,重則導致進程崩潰嚣伐。
image.png

不再用到的內存,沒有及時釋放应闯,就叫做內存泄漏(memory leak)纤控。
有些語言(比如 C 語言)必須手動釋放內存,程序員負責內存管理碉纺。
char * buffer;
buffer = (char*) malloc(42);
// Do something with buffer
free(buffer);
上面是 C 語言代碼船万,malloc方法用來申請內存,使用完畢之后骨田,必須自己用free方法釋放內存耿导。
這很麻煩,所以大多數(shù)語言提供自動內存管理态贤,減輕程序員的負擔舱呻,這被稱為"垃圾回收機制"(garbage collector)。

二、垃圾回收機制

垃圾回收機制怎么知道箱吕,哪些內存不再需要呢芥驳?

最常使用的方法叫做"引用計數(shù)"(reference counting):語言引擎有一張"引用表",保存了內存里面所有的資源(通常是各種值)的引用次數(shù)茬高。如果一個值的引用次數(shù)是0兆旬,就表示這個值不再用到了,因此可以將這塊內存釋放怎栽。

image.png

上圖中丽猬,左下角的兩個值,沒有任何引用熏瞄,所以可以釋放脚祟。
如果一個值不再需要了,引用數(shù)卻不為0强饮,垃圾回收機制無法釋放這塊內存由桌,從而導致內存泄漏。

const arr = [1, 2, 3, 4];
console.log('hello world');
上面代碼中胡陪,數(shù)組[1, 2, 3, 4]是一個值沥寥,會占用內存。變量arr是僅有的對這個值的引用柠座,因此引用次數(shù)為1邑雅。盡管后面的代碼沒有用到arr,它還是會持續(xù)占用內存妈经。
如果增加一行代碼淮野,解除arr對[1, 2, 3, 4]引用,這塊內存就可以被垃圾回收機制釋放了吹泡。

let arr = [1, 2, 3, 4];
console.log('hello world');
arr = null;
上面代碼中骤星,arr重置為null,就解除了對[1, 2, 3, 4]的引用爆哑,引用次數(shù)變成了0洞难,內存就可以釋放出來了。
因此揭朝,并不是說有了垃圾回收機制队贱,程序員就輕松了。你還是需要關注內存占用:那些很占空間的值潭袱,一旦不再用到柱嫌,你必須檢查是否還存在對它們的引用。如果是的話屯换,就必須手動解除引用编丘。

三、內存泄漏的識別方法

怎樣可以觀察到內存泄漏呢?
經驗法則是嘉抓,如果連續(xù)五次垃圾回收之后索守,內存占用一次比一次大,就有內存泄漏掌眠。這就要求實時查看內存占用蕾盯。
3.1 瀏覽器
Chrome 瀏覽器查看內存占用,按照以下步驟操作蓝丙。

image.png

1:打開開發(fā)者工具,選擇 Timeline 面板
2:在頂部的Capture字段里面勾選 Memory
3:點擊左上角的錄制按鈕望拖。
4:在頁面上進行各種操作渺尘,模擬用戶的使用情況。
5:一段時間后说敏,點擊對話框的 stop 按鈕鸥跟,面板上就會顯示這段時間的內存占用情況。

如果內存占用基本平穩(wěn)盔沫,接近水平医咨,就說明不存在內存泄漏。

image.png

反之架诞,就是內存泄漏了拟淮。

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谴忧,隨后出現(xiàn)的幾起案子很泊,更是在濱河造成了極大的恐慌,老刑警劉巖沾谓,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件委造,死亡現(xiàn)場離奇詭異,居然都是意外死亡均驶,警方通過查閱死者的電腦和手機昏兆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妇穴,“玉大人爬虱,你說我怎么就攤上這事∥肮牵” “怎么了饮潦?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長携狭。 經常有香客問我继蜡,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任稀并,我火速辦了婚禮仅颇,結果婚禮上,老公的妹妹穿的比我還像新娘碘举。我一直安慰自己忘瓦,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布引颈。 她就那樣靜靜地躺著耕皮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙场。 梳的紋絲不亂的頭發(fā)上凌停,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音售滤,去河邊找鬼罚拟。 笑死,一個胖子當著我的面吹牛完箩,可吹牛的內容都是我干的赐俗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼弊知,長吁一口氣:“原來是場噩夢啊……” “哼阻逮!你這毒婦竟也來了?” 一聲冷哼從身側響起吉捶,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤夺鲜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呐舔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币励,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年珊拼,在試婚紗的時候發(fā)現(xiàn)自己被綠了食呻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡澎现,死狀恐怖仅胞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情剑辫,我是刑警寧澤干旧,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站妹蔽,受9級特大地震影響椎眯,放射性物質發(fā)生泄漏挠将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一编整、第九天 我趴在偏房一處隱蔽的房頂上張望舔稀。 院中可真熱鬧,春花似錦掌测、人聲如沸内贮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夜郁。三九已至,卻和暖如春粘勒,著一層夾襖步出監(jiān)牢的瞬間拂酣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工仲义, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剑勾。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓埃撵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虽另。 傳聞我的和親對象是個殘疾皇子暂刘,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • 為什么需要垃圾回收 由于字符串、對象和數(shù)組沒有固定大小捂刺,只有當他們的大小已知時谣拣,才能對他們進行動態(tài)的存儲分配。Ja...
    宇cccc閱讀 1,051評論 1 0
  • 和C#族展、Java一樣JavaScript有自動垃圾回收機制森缠,也就是說執(zhí)行環(huán)境會負責管理代碼執(zhí)行過程中使用的內存,在...
    ConRon閱讀 290評論 0 0
  • 總結: javascript使用的是標記清除的方式: 這是JavaScript最常見的垃圾回收方式仪缸,當變量進入執(zhí)行...
    ironman_閱讀 140評論 0 0
  • 這是一部心機“綠茶婊”和癡情備胎男的毀三觀神劇 豆瓣簡介:因為15歲春天的一見鐘情贵涵,小動爽太對美麗的學姐紗繪子便展...
    顧小懶閱讀 2,458評論 2 1
  • G159期11組第六次小組會議20170705 主持人:陸豐 時間大臣:金一云 記錄大臣:金玲麗 參與伙伴:全體組...
    金玲麗King閱讀 445評論 0 0