电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS造成內存泄漏的幾種情況實例分析

瀏覽:115日期:2024-05-23 09:25:24

本文實例講述了JS造成內存泄漏的幾種情況。分享給大家供大家參考,具體如下:

介紹:

js中的內存垃圾回收機制:垃圾回收器會定期掃描內存,當某個內存中的值被引用為零時就會將其回收。當前變量已經使用完畢但依然被引用,導致垃圾回收器無法回收這就造成了內存泄漏。傳統頁面每次跳轉都會釋放內存,所以并不是特別明顯。

Vue單頁面應用中:Web App 與 傳統Web的區別,因為Web App是單頁面應用頁面通過路由跳轉不會刷新頁面,導致內存泄漏不斷堆積,導致頁面卡頓。

泄漏點:

1.DOM/BOM 對象泄漏2.script 中存在對DOM/BOM 對象的引用導致3.Javascript 對象泄漏4.通常由閉包導致,比如事件處理回調,導致DOM對象和腳本中對象雙向引用,這個時常見的泄漏原因

代碼關注點:

1.DOM中的addEventLisner 函數及派生的事件監聽, 比如Jquery 中的on 函數, vue 組件實例的 $on 函數,第三方庫中的初始化函數2.其它BOM對象的事件監聽, 比如websocket 實例的on 函數3.避免不必要的函數引用4.如果使用render 函數,避免在html標簽中綁定DOM/BOM 事件

Vue如何處理:

1.如果在mounted/created 鉤子中綁定了DOM/BOM 對象中的事件,需要在beforeDestroy 中做對應解綁處理2.如果在mounted/created 鉤子中使用了第三方庫初始化,需要在beforeDestroy 中做對應銷毀處理3.如果組件中使用了定時器,需要在beforeDestroy 中做對應銷毀處理4.模板中不要使用表達式來綁定到特定的處理函數,這個邏輯應該放在處理函數中?5.如果在mounted/created 鉤子中使用了$on,需要在beforeDestroy 中做對應解綁($off)處理6.某些組件在模板中使用 事件綁定可能會出現泄漏,使用$on 替換模板中的綁定

Vue官網講解避免內存泄露https://cn.vuejs.org/v2/cookbook/avoiding-memory-leaks.html

另外,vue 在IE edge瀏覽器下,父子組件的場景,子組件依賴父組件的狀態,子組件控制父組件狀態變化從而反饋給子組件的展示變化,子組件通過v-if模式存在于視圖中,父組件通過狀態控制子組件的v-if狀態變換。子組件控制父組件狀態完成子組件數據填充后,父組件切換子組件的v-if狀態,子組件占用dom結構被清理。此時,子組件存在時的內存占用未被釋放,當父組件再次回切v-if狀態時,子組件重新展示,內存飆升,重復幾次切換后,內存飆升明顯,頁面卡頓。

js通常內存泄漏的幾種情況的介紹

1.閉包

function fn1(){ var n=1;}//我想取到里面的局部變量nfunction fn1(){ var n=1; function fn2(){//在加一個fn2當他的子集 alert(n); } }

但是我在外面還是訪問不到那就return出來

function fn1(){ var n=1; function fn2(){//在加一個fn2當他的子集 alert(n); }return fn2(); //return出來后 他就給 window了所以一直存在內存中。因為一直在內存中,在IE里容易造成內存泄漏}fn1();

盡量書寫的時候,避免這種情況。

2.意外的全局變量

一個未聲明變量的引用會在全局對象中創建一個新的變量。在瀏覽器的環境下,全局對象就是 window,也就是說:

function foo(arg) { bar = 'aaaaa';} 實際上等價于function foo(arg) { window.bar = 'aaaaa';}

function foo() { this.variable = 'qqqqq';}//this 指向全局對象(window)foo();

為了防止這種錯誤的發生,可以在你的 JavaScript 文件開頭添加 ’use strict’; 語句

3.定時器setTimeout setInterval

當不需要setInterval或者setTimeout時,定時器沒有被clear,定時器的回調函數以及內部依賴的變量都不能被回收,造成內存泄漏。比如:vue使用了定時器,需要在beforeDestroy 中做對應銷毀處理。js也是一樣的。

clearTimeout(***)clearInterval(***)

4.如果在mounted/created 鉤子中使用了$on,需要在beforeDestroy 中做對應解綁($off)處理

beforeDestroy() { this.bus.$off(’****’);}

5、給DOM對象添加的屬性是一個對象的引用

var testObject = {}; document.getElementById(’idname’).property = testObject; //如果DOM不被消除,則testObject會一直存在,造成內存泄漏

解決方法:

在window.onunload事件中寫上:

window.onunload=function(){ document.getElementById(’idname’).property = null; //釋放內存};

6.DOM對象與JS對象相互引用

function testObject(element) { this.elementReference = element; // 為testObject(js)對象的屬性綁定element(DOM)對象element.property = this; // 為element(DOM)對象的屬性綁定testObject(js)對象} new testObject(document.getElementById(’idname’));

解決方法:

在window.onunload事件中寫上:

document.getElementById(’idname’).property = null;

7.從外到內執行appendChild。這時即使調用removeChild也無法釋放

var parentDiv = document.createElement('div'); var childDiv = document.createElement('div'); document.body.appendChild(parentDiv); parentDiv.appendChild(childDiv);

解決方法: 從內到外執行appendChild:

var parentDiv = document.createElement('div'); var childDiv = document.createElement('div'); parentDiv.appendChild(childDiv); document.body.appendChild(parentDiv);

8.反復重寫同一個屬性會造成內存大量占用(但關閉IE后內存會被釋放)

for(i = 0; i < 5000; i++) { hostElement.text = 'asdfasdfasdf'; }

這種方式相當于定義了5000個屬性!

9.注意程序邏輯,避免“死循環”之類的

10.echarts配合循環計時器等出現的內存泄漏

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript操作DOM技巧總結》、《JavaScript頁面元素操作技巧總結》、《JavaScript事件相關操作與技巧大全》、《JavaScript查找算法技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript錯誤與調試技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 劳动法网-专业的劳动法和劳动争议仲裁服务网 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 压力变送器-上海武锐自动化设备有限公司 | 达利园物流科技集团- | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜| 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 东亚液氮罐-液氮生物容器-乐山市东亚机电工贸有限公司 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 宜兴市恺瑞德环保科技有限公司| 铝箔-铝板-花纹铝板-铝型材-铝棒管-上海百亚金属材料有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 |