成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端進階之深入了解JS垃圾回收機制和內存泄漏

開發 前端
垃圾回收機制的原理是找到不再繼續使用的變量,釋放其內存。垃圾回收器會按照固定的時間間隔(或代碼中預定的收集時間),周期性地執行這一操作;Javascript 會找出不再使用的變量,不再使用意味著這個變量生命周期的結束。

[[425597]]

本文轉載自微信公眾號「Android開發編程」,作者Android開發編程。轉載本文請聯系Android開發編程公眾號。

前言

JS自帶一套內存管理引擎,負責創建對象、銷毀對象,以及垃圾回收。

我們來探討一下垃圾回收機制和內存泄露;

一、垃圾回收機制詳解

1、什么是js的回收機制

  • 垃圾回收機制的原理是找到不再繼續使用的變量,釋放其內存。垃圾回收器會按照固定的時間間隔(或代碼中預定的收集時間),周期性地執行這一操作;
  • Javascript 會找出不再使用的變量,不再使用意味著這個變量生命周期的結束。Javascript 中存在兩種變量——全局變量和局部變量,全部變量的聲明周期會一直持續,直到頁面卸載;
  • 而局部變量聲明在函數中,它的聲明周期從執行函數開始,直到函數執行結束。在這個過程中,局部變量會在堆或棧上被分配相應的空間以存儲它們的值,函數執行結束,這些局部變量也不再被使用,它們所占用的空間也就被釋放;
  • 垃圾回收的兩種實現方式:標記清除、引用計數

2、標記清除(主流瀏覽器做法)

  • 主要思想是給當前不使用的值加上標記,然后再回收他的內存;
  • 垃圾回收器在運行時會給存儲在內存中的變量加上標記,然后他會去掉環境變量和被環境變量引用的變量的標記,此后被加上標記的變量(環境變量中沒有使用訪問的變量)就是準備刪除的變量;最后垃圾回收器完成清除工作,銷毀那些帶標記的值,并回收他們占用的內存空間;

標記和掃描算法經過:

  • 根節點:一般來說,根是代碼中引用的全局變量;
  • 然后算法檢查所有根節點和他們的子節點并且把他們標記為活躍的(意思是他們不是垃圾)。任何根節點不能訪問的變量將被標記為垃圾;
  • 最后,垃圾收集器釋放所有未被標記為活躍的內存塊,并將這些內存返回給操作系統;

3、引用計數(IE9以下)

含義是跟蹤記錄所有值被引用的次數;

例如變量a賦值后,這個值的引用次數為1,這個a值又被賦值給另一個變量b,這時引用次數+1;但當b賦另外的值,引用次數-1;當值的引用書為0,說明沒有辦法再訪問這個值,這時就可以將內存回收了。

IE9以下還在使用引用計數,當對象循環引用時,引用次數無法標記為0,就會導致無法被回收。其他瀏覽器廢棄使用;

下面的代碼

  1. var o1 = { 
  2.   o2: { 
  3.     x: 1 
  4.   } 
  5. }; 
  6. // 兩個對象被創建。 
  7. // ‘o1’對象引用‘o2’對象作為其屬性。 
  8. // 不可以被垃圾收集 
  9. var o3 = o1; // ‘o3’變量是第二個引用‘o1‘指向的對象的變量.  
  10. o1 = 1;      // 現在,在‘o1’中的對象只有一個引用,由‘o3’變量表示 
  11. var o4 = o3.o2; // 對象的‘o2’屬性的引用. 
  12.                 // 此對象現在有兩個引用:一個作為屬性、另一個作為’o4‘變量 
  13. o3 = '374'; // 原來在“o1”中的對象現在為零,對它的引用可以垃圾收集。 
  14.             // 但是,它的‘o2’屬性存在,由‘o4’變量引用,因此不能被釋放。 
  15. o4 = null; // ‘o1’中最初對象的‘o2’屬性對它的引用為零。它可以被垃圾收集。 

二、Js常見的內存泄漏

內存泄漏是應用程序過去使用,但不再需要的尚未返回到操作系統或可用內存池的內存片段。由于沒有被釋放而導致的,它將可能引起程序的卡頓和崩潰;

1、意外的全局變量

  1. function foo(arg) { 
  2.     bar = "test"
  3.     // window.bar = "test"

js對未聲明變量會在全局最高對象上創建它的引用,(是以屬性存在的,而不是變量),如果在游覽器上就是window對象,如果在node環境下就是global;如果未聲明的變量緩存大量的數據,它可能只有在頁面被刷新或者被關閉的時候才會釋放內存,這樣就造成了內存意外泄漏;

2、被忘記的定時器或者回調函數

我們以經常在 JavaScript 中使用的 setInterval 為例;

  1. var serverData = loadData(); 
  2. setInterval(function() { 
  3.     var renderer = document.getElementById('renderer'); 
  4.     if(renderer) { 
  5.         renderer.innerHTML = JSON.stringify(serverData); 
  6.     } 
  7. }, 5000); //每5秒執行一次. 
  • 上面的代碼片段顯示了使用定時器引用節點或無用數據的后果。它既不會被收集,也不會被釋放。無法被垃圾收集器收集,頻繁的被調用,占用內存;
  • 而正確的使用方法是,確保一旦依賴于它們的事件已經處理完成,就通過明確的調用來刪除它們;

3、閉包

  • 閉包是一個函數A返回一個內聯的函數B,及時A函數執行完函數B也可以訪問函數A里面的變量,這就是一個簡單的閉包;
  • 本質上閉包是將函數內部和外部連接起來的一座橋梁;
  1. function my(name) { 
  2.     function sendName() { 
  3.         console.log(name
  4.     } 
  5.     return sendName 
  6. var test=my("test"
  7. test()  //test 

在my()內部創建的sendName()函數是不會被回收的,因為它被全局變量test引用,處于隨時被調用的狀態。如果向釋放內存可以設置test=null;由于閉包會攜帶包含它的函數的作用域,因此會比其他函數占用更多的內存。過度使用閉包可能會導致內存占用過多

4、DOM泄漏

  • 瀏覽器中DOM和js采用的是不一樣的引擎,DOM采用的是渲染引擎,而js采用的是v8引擎,所以在用js操作DOM時會比較耗費性能,因為他們需要橋來鏈接他們。為了減少DOM的操作,我們一般將常用的DOM;
  • 我們會采用變量引用的方式會將其緩存在當前環境。如果在進行一些刪除、更新操作之后,可能會忘記釋放已經緩存的DOM;
  1. var elements = { 
  2.     button: document.getElementById('button'), 
  3.     image: document.getElementById('image'
  4. }; 
  5. function doStuff() { 
  6.     elements.image.src = 'http://test.png'
  7. function removeImage() { 
  8.     // image 元素是body的直接子元素。 
  9.     document.body.removeChild(document.getElementById('image')); 
  10.     // 我們仍然可以在全局元素對象中引用button。換句話說,button元素仍在內存中,無法由GC收集 

總結

GC機制是自動完成的,但我們可以強制啟動它,或是關閉它;

我們在開發中要注意內存泄露問題,不然會出現意想不到的情況;

 

一起學習加油;

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2011-07-04 13:12:04

JavaScript

2011-01-18 14:06:58

JavaScriptweb

2009-12-09 17:28:34

PHP垃圾回收機制

2021-11-05 15:23:20

JVM回收算法

2010-09-26 14:08:41

Java垃圾回收

2019-08-19 12:50:00

Go垃圾回收前端

2023-02-28 07:56:07

V8內存管理

2024-02-22 17:15:22

JS垃圾回收機制

2019-09-12 09:30:50

Vue項目內存

2010-09-25 15:33:19

JVM垃圾回收

2017-03-03 09:26:48

PHP垃圾回收機制

2017-08-17 15:40:08

大數據Python垃圾回收機制

2009-06-23 14:15:00

Java垃圾回收

2010-09-26 11:22:22

JVM垃圾回收JVM

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2010-09-16 15:10:24

JVM垃圾回收機制

2010-09-25 15:26:12

JVM垃圾回收

2021-05-27 21:47:12

Python垃圾回收

2015-06-04 09:38:39

Java垃圾回收機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 人人九九精 | 毛片一区二区 | 欧美视频一区二区三区 | 91精品国产色综合久久 | 精品国产乱码久久久久久中文 | 成人国产a | 狠狠的日 | 国产精品资源在线 | 日韩免费一二三区 | 免费三级黄 | 国产综合久久久久久鬼色 | 欧美日韩在线视频观看 | 手机av网| 91福利在线观看视频 | 久久久久久国产精品 | 久久久国产精品 | 日韩av成人在线观看 | 国产9 9在线 | 中文 | 欧美激情免费在线 | 精品亚洲一区二区三区 | 欧美精品网 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品视频一区二区三区, | 手机av免费在线 | 亚洲一区二区精品视频在线观看 | 欧美精品一区二区三区视频 | 亚洲国产视频一区 | 国精产品一区二区三区 | a级网站| 国产乱码精品一品二品 | 日韩一级在线 | 亚洲国产成人精 | 成人免费精品视频 | 亚洲高清视频在线 | 日皮视频免费 | 99re国产视频 | 在线中文字幕av | 亚洲精品18 | cao在线| 亚洲一区二区三区在线 | 欧美大片黄 |