JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧
本文實(shí)例講述了JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧,非常實(shí)用。分享給大家供大家參考之用。具體方法如下:
本文內(nèi)容源自谷歌WebPerf(倫敦WebPerf集團(tuán)),2014年8月26日。
一般來說,高效的JavaScript Web應(yīng)用必須流暢,快速。與用戶交互的任何應(yīng)用程序,都需要考慮如何確保內(nèi)存有效使用,因?yàn)槿绻倪^多,頁面就會(huì)崩潰,迫使用戶重新加載。而你只能躲在角落哭泣。
自動(dòng)垃圾收集是不能代替有效的內(nèi)存管理的,特別是在大型,長時(shí)間運(yùn)行的Web應(yīng)用程序中。本文中,我們將演示如何通過Chrome的DevTools對(duì)內(nèi)存進(jìn)行有效的管理。
并了解如何解決性能問題,如內(nèi)存泄漏,頻繁的垃圾收集暫停,和整體內(nèi)存膨脹,那些真正讓你耗費(fèi)精力的東西。
Addy Osmani在他的PPT中展示了很多會(huì)在Chrome V8中產(chǎn)生內(nèi)存泄漏的示例:
1) Delete一個(gè)Object的屬性會(huì)讓此對(duì)象變慢(多耗費(fèi)15倍的內(nèi)存)
var o = { x: 'y' }; delete o.x; //此時(shí)o會(huì)成一個(gè)慢對(duì)象 o.x; // var o = { x: 'y' }; o = null; //應(yīng)該這樣
2) 閉包
在閉包中引入閉包外部的變量時(shí),當(dāng)閉包結(jié)束時(shí)此對(duì)象無法被垃圾回收(GC)。
var a = function() { var largeStr = new Array(1000000).join('x'); return function() { return largeStr; } }();
3) DOM泄露
當(dāng)原有的COM被移除時(shí),子結(jié)點(diǎn)引用沒有被移除則無法回收。
var select = document.querySelector; var treeRef = select('#tree'); //在COM樹中l(wèi)eafRef是treeFre的一個(gè)子結(jié)點(diǎn) var leafRef = select('#leaf'); var body = select('body'); body.removeChild(treeRef); //#tree不能被回收入,因?yàn)閠reeRef還在 //解決方法: treeRef = null; //tree還不能被回收,因?yàn)槿~子結(jié)果leafRef還在 leafRef = null; //現(xiàn)在#tree可以被釋放了。
4) Timers計(jì)(定)時(shí)器泄露
定時(shí)器也是常見產(chǎn)生內(nèi)存泄露的地方:
for (var i = 0; i < 90000; i++) { var buggyObject = { callAgain: function() { var ref = this; var val = setTimeout(function() { ref.callAgain(); }, 90000); } } buggyObject.callAgain(); //雖然你想回收但是timer還在 buggyObject = null; }
5) 調(diào)試內(nèi)存
Chrome自帶的內(nèi)存調(diào)試工具可以很方便地查看內(nèi)存使用情況和內(nèi)存泄露:
在 Timeline -> Memory 點(diǎn)擊record即可:
希望本文所述對(duì)大家javascript程序設(shè)計(jì)的學(xué)習(xí)有所幫助。
- 解決JS內(nèi)存泄露之js對(duì)象和dom對(duì)象互相引用問題
- JS閉包、作用域鏈、垃圾回收、內(nèi)存泄露相關(guān)知識(shí)小結(jié)
- 解決js函數(shù)閉包內(nèi)存泄露問題的辦法
- 淺談js 閉包引起的內(nèi)存泄露問題
- 容易造成JavaScript內(nèi)存泄露幾個(gè)方面
- 關(guān)于js內(nèi)存泄露的一個(gè)好例子
- js內(nèi)存泄露的幾種情況詳細(xì)探討
- Javascript 閉包引起的IE內(nèi)存泄露分析
- 權(quán)威JavaScript 中的內(nèi)存泄露模式
- 總結(jié)JavaScript在IE9之前版本中內(nèi)存泄露問題
相關(guān)文章
JS 中實(shí)現(xiàn)一個(gè)串型異步函數(shù)隊(duì)列
這篇文章主要介紹了JS 中實(shí)現(xiàn)一個(gè)串型異步函數(shù)隊(duì)列,文章通過async/await 串型請(qǐng)求展開詳情,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07javascript實(shí)現(xiàn)小型區(qū)塊鏈功能
這篇文章主要介紹了javascript實(shí)現(xiàn)小型區(qū)塊鏈功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04JS簡單實(shí)現(xiàn)無縫滾動(dòng)效果實(shí)例
這篇文章主要介紹了JS簡單實(shí)現(xiàn)無縫滾動(dòng)效果,結(jié)合完整實(shí)例形式分析了javascript實(shí)現(xiàn)圖片無縫滾動(dòng)效果的實(shí)現(xiàn)技巧,涉及javascript結(jié)合時(shí)間函數(shù)定時(shí)觸發(fā)動(dòng)態(tài)修改頁面元素屬性的相關(guān)操作方法,需要的朋友可以參考下2016-08-08關(guān)于字符串和對(duì)象互轉(zhuǎn)以及JSON.parse()的坑
這篇文章主要介紹了關(guān)于字符串和對(duì)象互轉(zhuǎn)以及JSON.parse()的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)
下面小編就為大家?guī)硪黄獙?shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10微信小程序中做用戶登錄與登錄態(tài)維護(hù)的實(shí)現(xiàn)詳解
微信小程序的運(yùn)行環(huán)境不是在瀏覽器下運(yùn)行的。所以不能以cookie來維護(hù)登錄態(tài)。下面這篇文章主要給大家介紹了微信小程序中如何做用戶登錄與登錄態(tài)維護(hù)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí)。2017-05-05通過BootStrap實(shí)現(xiàn)輪播圖的實(shí)際應(yīng)用
js我們沒有學(xué)過,今天我是用bootstrap實(shí)現(xiàn)輪播圖的效果,非常不錯(cuò)代碼簡單易懂,需要的朋友參考下吧2016-09-09layui字體圖標(biāo) loading圖標(biāo)靜止不旋轉(zhuǎn)的解決方法
今天小編就為大家分享一篇layui字體圖標(biāo) loading圖標(biāo)靜止不旋轉(zhuǎn)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09window.name代替cookie的實(shí)現(xiàn)代碼
window.name代替cookie的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-11-11