你覺得內存泄露怎麼偵測(適用於平常工做和麪試)

檢查內存泄漏的工具及使用方法:

  1. f12打開谷歌開發者工具
  2. 選擇memory--Profiles--Heap snapshot
  3. 進入要檢查的頁面,並在內存變化以前(從下面的例子來講的話,就是在第一個setTimeout以前,也就是閉包產生以前)點擊 Take snapshot,此時瀏覽器會保存一個當前內存的快照。
  4. 而後變化以後再次點擊左上角(Profiles上面)的黑色按鈕,再保存一個內存快照。
  5. 分別選擇兩次快照,並點擊summary旁邊的下箭頭,選擇下拉列表中的comparison,這個選項下呈現的是本次(兩次快照之間可能存在屢次變化,只對比當次與上次間的變化)變化先後的內存差別(固然,初始的快照由於沒有變化,因此該列無內容)。
  6. 選擇下方constructor中的closure,該選項下呈現的都是變化先後閉包的相關內容。其中new這一欄有·(黑點),表示本次變化新增閉包內存的佔用,deleted這一欄有·(黑點),表示本次變化清除該閉包占用的內存。

用例

//全局做用域下寫了如下代碼
//發生內存泄漏的例子
var obj = {};
function outFun (){
    var a = 0;
    return function innerFun(b){
        a+=b;
        return a;
    }
}
setTimeout(function (){
    obj.newFunc = outFun();
    console.log(obj.newFunc(1)); //1
},3000);
setTimeout(function (){
    obj.newFunc = null;
    console.log('clean'); //clean
},6000);
複製代碼

觀察分析

  1. 初始時內存快照,無變化,因此無內容
  2. 第一個settimeout以後,本次建立了閉包並佔用了內存
  3. 第二個settimeout以後,本次變化將引用閉包的對象屬性置空,閉包占用的內存被釋放

文中相關

閉包的深刻分析與探究請看這裏: 你覺得什麼是閉包瀏覽器

寫在最後

須要聲明的一點是,我不是一個教授者,我只是一個分享者、一個討論者、一個學習者,有不一樣的意見或新的想法,提出來,咱們一塊兒研究。分享的同時,並不僅是被分享者在學習進步,分享者亦是。bash

知識遍地,拾到了就是你的。閉包

既然有用,不妨點贊,讓更多的人瞭解、學習並提高。工具

相關文章
相關標籤/搜索