天天看點

記憶體洩漏

記憶體洩漏

記憶體洩漏(Memory Leak)是指程式中己動态配置設定的堆記憶體由于某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導緻程式運作速度減慢甚至系統崩潰等嚴重後果。

原因:不是說所有的閉包都會産生記憶體洩漏,隻是不恰當的閉包會。閉包可以維持函數内局部變量,使其得不到釋放。這種未得到釋放的局部變量就會導緻記憶體洩漏。

解決:将事件處理函數定義在外部,解除閉包,或者在定義事件處理函數的外部函數中,删除引用。

原因:在我們開發時,會存在定義過多的全局變量,這些全局變量,使用過多,且使用完後,未被釋放掉,會導緻記憶體洩漏。

解決:在 JavaScript 檔案頭部加上 'use strict',可以避免此類錯誤發生。啟用嚴格模式解析 JavaScript ,避免意外的全局變量。

計時器

原因:在使用定時器setInterval、setTimeout後,未對其進行清除

解決:clearInterval, clearTimeout

回調函數

原因:在vue開發中,我們常見的是在created或mounted時進行事件的監聽,就沒了後續,這樣也容易産生

解決:在destoryed時需要将該事件登出掉。

dom元素

原因:在開發,會定義變量來聲明dom元素,這種是對象的引用,頁面存在dom元素的移除,但是改引用還是存在記憶體中。

解決:清除相應的引用,複制為null

chrome的 performance

打開開發者工具 Performance

勾選 Screenshots 和 memory

左上角小圓點開始錄制(record)

停止錄制

如果面闆中的HEAP欄在一直往上增長,那麼存在記憶體洩漏,在快照中我們可以采用相同的操作執行幾次快照,然後進行快照的比對,從中可以看出一些不同的變化,如果變化過大,則可以根據相應的不同排查問題,例如某個array在變大。或者從GC root 根節點出發,可達的對象裡,哪些對象占用大量記憶體,這些就是可排查的對象。

在開發中對于一些變量的使用,特别是引用類的,我們如果使用完後,確定可以不用了,我們可以手動的将它複制為null,讓他可以被回收掉。

還有就是上面所說的那幾種情況,以及相應的解決方式。

繼續閱讀