記憶體泄漏
- 記憶體泄漏含義:
- 1.造成記憶體泄漏的情況
- 1.1
- 1.2
- 1.3
- 2.解決記憶體泄漏的方式
- 2.1global variables:
- 2.2使用timers或者callbacks
- 2.3 閉包可以訪問外部(封閉)函式變數的內部函式
- 2.4DOM參考
記憶體泄漏含義:
記憶體泄漏指任何物件在不再擁有或需要它之后任然存在
1.造成記憶體泄漏的情況
1.1
垃圾回收器定期掃描物件,并計算參考了每個物件的其他物件的數量,如果一個物件的參考數量為0(沒有其他物件參考過該物件)或對該物件的唯一參考是回圈的,那么該物件的記憶體即可回收
1.2
setTimeout的第一個引數使用字串而非函式的話,會引發記憶體泄漏
1.3
閉包、控制臺日志、回圈(在兩個物件彼此參考且彼此保留時,就會產生一個回圈)
2.解決記憶體泄漏的方式
2.1global variables:
對未宣告的變數的參考在全域物件內創建一個新變數,在瀏覽器中,全域物件就是window
function foo(arg){
var='some text' //等同于window.var ='some text'
}
解決:創建意外的全域變數
function foo(){
this.var='potential accident'
}
- 可以在js檔案開頭添加 ’ use strict’ ,使用嚴格模式,這樣在嚴格模式下決議js可以防止意外的全域變數
- 在使用完之后,對其賦值為null或者重新分配
2.2使用timers或者callbacks
在js中使用setInterval非常常見
大多數庫都會提供觀察者或者其它工具來處理回呼函式,在他們自己的實體變為不可達時,會讓回呼函式也變為不可達,對于setInterval,下面這樣的代碼非常常見
var servarData=loadData()
setInterval(function(){
var render =document.getElementById('render')
if(render){
render.innerHTML=JSON.stringify(serverData)
}
},5000)
這個例子闡述著timers可能發生的情況:計時器會參考不再需要的節點或資料
2.3 閉包可以訪問外部(封閉)函式變數的內部函式
js開發的一個關鍵方面就是閉包:一個可以訪問(封閉)函式變數的內部函式,
var theThing=null
var replaceThing=function(){
var originalThing=theThing
var unused=function(){
if(originalThing) console.log('hi')
theThing={
longStr:new Array(1000000).join('*'),
someMethod:function(){
console.log('message')
}
}
}
}
setInterval(replaceThing,1000)
2.4DOM參考
有時候,在資料結構中存盤DOM結構是有用的,假設要快速更新表中的幾行內容,將每行DOM的參考存盤在字典或陣列中可能是有意義的,當這種情況發生時,就會保留同一DOM元素的兩份參考:一個在DOM樹中,另一個在字典中,如果將來某個時候你決定要洗掉這些行,則需要讓兩個參考都不可達
var elements ={
button:document.getElementById('button'),
image:document.getElementById('image')
}
function doStuff(){
elements.image.src='http://example.com/image_name.png'
}
function removeImage(){
document.body.removeChild(document.getElementById('image'))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302306.html
標籤:其他
