亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js內存泄露的幾種情況詳細探討

2019-11-20 22:40:29
字體:
來源:轉載
供稿:網友
內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。在C++中,因為是手動管理內存,內存泄露是經常出現的事情。而現在流行的C#和Java等語言采用了自動垃圾回收方法管理內存,正常使用的情況下幾乎不會發生內存泄露。瀏覽器中也是采用自動垃圾回收方法管理內存,但由于瀏覽器垃圾回收方法有bug,會產生內存泄露。

1、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內存泄露。
復制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>

應改成下面
復制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>

或者采用事件委托
復制代碼 代碼如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
document.onclick = function(event){
event = event || window.event;
if(event.target.id == "myBtn"){
document.getElementById("myDiv").innerHTML = "Processing...";
}
}
</script>

2、
復制代碼 代碼如下:

var a=document.getElementById("#xx");
var b=document.getElementById("#xxx");
a.r=b;
b.r=a;

復制代碼 代碼如下:

var a=document.getElementById("#xx");
a.r=a;

對于純粹的 ECMAScript 對象而言,只要沒有其他對象引用對象 a、b,也就是說它們只是相互之間的引用,那么仍然會被垃圾收集系統識別并處理。但是,在 Internet Explorer 中,如果循環引用中的任何對象是 DOM 節點或者 ActiveX 對象,垃圾收集系統則不會發現它們之間的循環關系與系統中的其他對象是隔離的并釋放它們。最終它們將被保留在內存中,直到瀏覽器關閉。
3、
復制代碼 代碼如下:

var elem = document.getElementById('test');
elem.addEventListener('click', function() {
alert('You clicked ' + elem.tagName);
});

這段代碼把一個匿名函數注冊為一個DOM結點的click事件處理函數,函數內引用了一個DOM對象elem,就形成了閉包。這就會產生一個循環引用,即:DOM->閉包->DOM->閉包...DOM對象在閉包釋放之前不會被釋放;而閉包作為DOM對象的事件處理函數存在,所以在DOM對象釋放前閉包不會釋放,即使DOM對象在DOM tree中刪除,由于這個循環引用的存在,DOM對象和閉包都不會被釋放。可以用下面的方法可以避免這種內存泄露
復制代碼 代碼如下:

var elem = document.getElementById('test');
elem.addEventListener('click', function() {
alert('You clicked ' + this.tagName); // 不再直接引用elem變量
});

4、
復制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}

閉包非常容易構成循環引用。如果一個構成閉包的函數對象被指定給,比如一個 DOM 節點的事件處理器,而對該節點的引用又被指定給函數對象作用域中的一個活動(或可變)對象,那么就存在一個循環引用。
DOM_Node.onevent -<function_object.[[scope]] -<scope_chain -<Activation_object.nodeRef -<DOM_Node。

形成這樣一個循環引用是輕而易舉的,而且稍微瀏覽一下包含類似循環引用代碼的網站(通常會出現在網站的每個頁面中),就會消耗大量(甚至全部)系統內存。
解決之道,將事件處理函數定義在外部,解除閉包
復制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=onclickHandler;
}
function onclickHandler(){
//do something
}

或者在定義事件處理函數的外部函數中,刪除對dom的引用(題外,《JavaScript權威指南》中介紹過,閉包中,作用域中沒用的屬性可以刪除,以減少內存消耗。)
復制代碼 代碼如下:

function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}

5、
復制代碼 代碼如下:

a = {p: {x: 1}};
b = a.p;
delete a.p;

執行這段代碼之后b.x的值依然是1.由于已經刪除的屬性引用依然存在,因此在JavaScript的某些實現中,可能因為這種不嚴謹的代碼而造成內存泄露。所以在銷毀對象的時候,要遍歷屬性中屬性,依次刪除。
6. 自動類型裝箱轉換
別不相信,下面的代碼在ie系列中會導致內存泄露
復制代碼 代碼如下:

var s=”lalala”;
alert(s.length);

s本身是一個string而非object,它沒有length屬性,所以當訪問length時,JS引擎會自動創建一個臨時String對象封裝s,而這個對象一定會泄露。這個bug匪夷所思,所幸解決起來相當容易,記得所有值類型做.運算之前先顯式轉換一下:
復制代碼 代碼如下:

var s="lalala";
alert(new String(s).length);

7、某些DOM操作
IE系列的特有問題 簡單的來說就是在向不在DOM樹上的DOM元素appendChild;IE7中,貌似為了改善內存泄露,IE7采用了極端的解決方案:離開頁面時回收所有DOM樹上的元素,其它一概不管。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产91久久久| 国产69久久精品成人| 久久久精品国产亚洲| 国产成人亚洲综合| 日韩精品极品视频| 亚洲综合中文字幕在线观看| 欧日韩在线观看| 疯狂做受xxxx欧美肥白少妇| 国产91免费看片| 国产成人欧美在线观看| 成人免费网视频| 亚洲欧美日韩网| 欧美视频在线观看免费| 日韩精品免费看| 成人免费直播live| 亚洲香蕉成视频在线观看| 成人www视频在线观看| 久久躁狠狠躁夜夜爽| 欧美福利在线观看| 亚洲综合中文字幕在线观看| 久久精品久久精品亚洲人| 一本一本久久a久久精品综合小说| 久久精品久久久久久| 国产精品成人一区二区三区吃奶| 国产亚洲欧美日韩一区二区| 成人福利在线观看| 丰满岳妇乱一区二区三区| 国产91色在线免费| 国产精品白嫩美女在线观看| 国产精品爽爽ⅴa在线观看| 91超碰中文字幕久久精品| 中文字幕视频在线免费欧美日韩综合在线看| 欧美日韩中文字幕综合视频| 亚洲人成网在线播放| 久久成人精品电影| 日韩欧美中文字幕在线播放| 色www亚洲国产张柏芝| 亚洲日本aⅴ片在线观看香蕉| 亚洲欧美日韩天堂一区二区| 国产精品揄拍500视频| 日韩网站免费观看高清| 中文欧美在线视频| 亚洲大胆人体av| 日韩精品中文字幕在线播放| 久久久国产成人精品| 国产成人精品视频| 欧美性生交大片免网| 久久久久久一区二区三区| 国产乱肥老妇国产一区二| 91精品国产综合久久香蕉的用户体验| 少妇精69xxtheporn| 欧美视频一区二区三区…| 亚洲国产精品久久久久秋霞蜜臀| 91视频国产精品| 国产美女精品免费电影| 欧美与黑人午夜性猛交久久久| 久久综合免费视频| 韩国一区二区电影| 亚洲欧美日本伦理| 九九热视频这里只有精品| www日韩欧美| 精品欧美一区二区三区| 日韩av免费在线播放| 国产精品精品一区二区三区午夜版| 国产精品一区二区久久精品| 欧美日韩亚洲国产一区| 亚洲国产中文字幕在线观看| 国产91成人video| 亚洲欧美日韩在线一区| 亚洲免费视频一区二区| 人九九综合九九宗合| 欧美在线视频网| 欧美怡红院视频一区二区三区| 在线播放日韩精品| 国产亚洲欧美日韩美女| 日日骚av一区| 亚洲国产高潮在线观看| 欧美一级电影久久| 久久精品人人做人人爽| 亚洲精品97久久| 国内精品美女av在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美激情一区二区三区高清视频| 欧美性视频网站| 日韩欧美一区二区三区久久| 亚洲电影成人av99爱色| 69av在线视频| 日韩欧美在线一区| 欧美肥老太性生活视频| 97香蕉久久夜色精品国产| 久久成人av网站| 亚洲专区在线视频| 国产精品久久77777| 国产国语videosex另类| 亚洲国产中文字幕久久网| 国产精品美女无圣光视频| 91大神在线播放精品| 欧美裸身视频免费观看| 国产精品自产拍在线观| 一区二区三区四区在线观看视频| 夜夜嗨av一区二区三区四区| 成人免费视频网| 夜夜嗨av色一区二区不卡| 最好看的2019年中文视频| 亚洲精品国产精品自产a区红杏吧| 日韩有码片在线观看| 欧美性xxxxx极品| 亚洲色图校园春色| 久久久久久久久久国产精品| 91久久精品美女| 在线成人激情视频| 亚洲区在线播放| 成人字幕网zmw| 91亚洲精品久久久久久久久久久久| 亚洲成人免费在线视频| 精品无码久久久久久国产| 日韩高清免费在线| 亚洲性线免费观看视频成熟| 在线精品播放av| 欧美性猛交xxxx乱大交蜜桃| 成人免费高清完整版在线观看| 色偷偷av一区二区三区乱| 欧美国产日韩视频| 国产精品91久久久久久| 欧美极品少妇xxxxⅹ免费视频| 欧美成人精品影院| 亚洲图片制服诱惑| 欧美高清电影在线看| 亚洲精品一区二区在线| 久久精品国产亚洲精品| 26uuu亚洲国产精品| 奇门遁甲1982国语版免费观看高清| 国产精品日韩一区| 久久精品视频网站| 97欧美精品一区二区三区| 国产精品国内视频| 91亚洲精品一区二区| 992tv成人免费影院| 97久久超碰福利国产精品…| 欧美日韩国产限制| 91在线看www| 亚洲欧美成人网| 亚洲亚裔videos黑人hd| 色综合久久88色综合天天看泰| 九九热这里只有在线精品视| 亚洲欧洲美洲在线综合| 亚洲国产成人av在线| 欧日韩不卡在线视频| 免费成人高清视频| 亚洲男人天堂视频| 日韩资源在线观看| 米奇精品一区二区三区在线观看| 韩国精品美女www爽爽爽视频| 欧美激情精品久久久久久蜜臀| 2020久久国产精品| 久久免费视频这里只有精品| 国产精品91免费在线| 国产精品一区二区久久精品| 日韩av在线一区| 国外成人在线播放| 国产日韩欧美另类| 色噜噜国产精品视频一区二区| 色偷偷888欧美精品久久久| 亚洲国产欧美一区二区三区久久|