通過監(jiān)控了解自己的代碼有沒有內(nèi)存問題---Performance

我們之前聊過關(guān)于瀏覽器中內(nèi)存是如何管理、垃圾回收集中常見算法歪架、以及V8引擎中如何做垃圾回收股冗。那么又到了一個老生常談的話題 -- “道理我都懂”,我怎么知道我寫的代碼有沒有內(nèi)存問題呢和蚪?接下來就給大家推薦一款工具---Performance

為什么使用Performance

GC的目的是為了實現(xiàn)內(nèi)存空間的良性循環(huán)魁瞪,并且只有合理使用GC才能夠達(dá)到這種良性循環(huán)。那么如何時刻關(guān)注GC是不是合理使用了惠呼,Performance 就給我們提供了多種監(jiān)控方式,讓我們實時關(guān)注我們的內(nèi)存狀態(tài)以及GC的工作狀態(tài)峦耘。

如何使用Performance

  1. 打開瀏覽器輸入目標(biāo)地址剔蹋,不跳轉(zhuǎn)
  2. 進(jìn)入開發(fā)者模式,打開性能
  3. 開啟錄制功能辅髓,開始訪問輸入的地址
  4. 操作頁面執(zhí)行用戶行為泣崩,一段時間后停止錄制
  5. 生成過程的內(nèi)存記錄信息,分析信息

如何定位內(nèi)存問題

  • 網(wǎng)絡(luò)正常的情況下洛口,頁面出現(xiàn)延遲加載或經(jīng)常性的暫停(可能因為頻繁垃圾回收)
  • 頁面持續(xù)性出現(xiàn)糟糕的性能(可能因為內(nèi)存膨脹矫付,內(nèi)存申請過大)
  • 頁面的性能隨時間延長越來越差 (內(nèi)存泄露)

界定內(nèi)存問題的標(biāo)準(zhǔn)

  • 內(nèi)存泄露: 內(nèi)存使用持續(xù)升高
  • 內(nèi)存膨脹: 在多數(shù)設(shè)備上都存在的性能問題,申請值過大第焰,若不同的設(shè)備表現(xiàn)一致买优,則因程序問題
  • 頻繁垃圾回收: 通過內(nèi)存變化圖進(jìn)行分析

監(jiān)控內(nèi)存的方式

  • 瀏覽器任務(wù)管理器
  • Timeline 時序圖記錄
  • 堆快照查找分離DOM
  • 其他功能判斷是否存在頻繁的垃圾回收

任務(wù)管理器監(jiān)控內(nèi)存

任務(wù)管理器中調(diào)取網(wǎng)頁的javascript內(nèi)存,觀察內(nèi)存是否在一直上漲挺举,如果一直升高杀赢,那么證明內(nèi)存管理存在問題,但是無法判斷是什么導(dǎo)致的該問題

Timeline 記錄內(nèi)存

我們用一段代碼來模擬一下創(chuàng)建大量dom節(jié)點以及創(chuàng)建長度超長的字符串對內(nèi)存的影響湘纵,以及我們?nèi)绾稳ナ褂胻imeline觀測這部分內(nèi)存變化

<body>
    <button id="btn">Add</button>
    <script>
         // 模擬創(chuàng)建大量dom節(jié)點
        const btn = document.getElementById("btn")
        btn.onclick = () => {
            test()
        }
        const arrList = []
        function test() {
            for (let i = 0;i< 100000; i++) {
                document.body.appendChild(document.createElement("p"))
            }
            arrList.push(new Array(1000000).join("x"))
        }
    </script>
</body>

我們使用Performance脂崔,采用之前提到過的方法到了一個監(jiān)控的記錄如下:


image.png

我們可以從這部分中觀察到指定時間段的內(nèi)存變化以及此時頁面所處的狀態(tài)便于我們?nèi)ヅ挪閱栴},另外我們也可以從底部的記錄里面觀察到j(luò)s堆梧喷、文檔砌左、node 節(jié)點等等諸多相關(guān)變化信息脖咐,以助于我們?nèi)ダ斫鈨?nèi)存變化以及GC策略的執(zhí)行。

堆快照查找分離DOM

  • 界面元素存活在DOM樹上
  • 垃圾對象的DOM節(jié)點(從DOM樹上脫離汇歹,js代碼也不在引用)
  • 分離狀態(tài)的DOM節(jié)點(從DOM樹上脫離屁擅,但js代碼還在引用)

如何拍攝堆快照

image.png

點擊如圖所示的按鈕,就會按照拍攝一張堆快照放在左側(cè)的列表
我們依然模擬一下使用場景

<body>
    <button id="btn">Add</button>
    <script>
        let ulTem
        function test() {
            let ul = document.createElement("ul")
            for (let i = 0;i< 10; i++) {
                let li = document.createElement("li")
                ul.appendChild(li)
            }
            ulTem = ul
        }
        document.getElementById("btn").addEventListener("click", test)
    </script>
</body>

代碼中我們可以看到ul是沒有被渲染到頁面上的秤朗,但是它被一個變量給引用了煤蹭,那么就導(dǎo)致他在后續(xù)的GC過程中無法被清除。

如何查看堆快照

image.png

我們找到程序執(zhí)行后的代碼發(fā)現(xiàn)取视,的確有ul 以及 li沒有被清理硝皂。
那么如何去解除他們的引用,很簡單 只需要將ulTem = null即可

那么以上就是常使用的集中監(jiān)控方式已經(jīng)介紹完了作谭。

判斷是否存在頻繁GC

  • GC工作時應(yīng)用程序是停止的
  • 頻繁且時間過長的GC常導(dǎo)致應(yīng)用假死
  • 用戶使用中感知應(yīng)用卡頓
    所以需要我們?nèi)ゴ_實是否存在頻繁的垃圾回收并且去避免

那么如何確定頻繁的垃圾回收稽物?

  • Timeline 中頻繁的短時間內(nèi)上升下降
  • 任務(wù)管理器中數(shù)據(jù)頻繁的迅速增加迅速減小
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市折欠,隨后出現(xiàn)的幾起案子贝或,更是在濱河造成了極大的恐慌,老刑警劉巖锐秦,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咪奖,死亡現(xiàn)場離奇詭異,居然都是意外死亡酱床,警方通過查閱死者的電腦和手機(jī)羊赵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扇谣,“玉大人昧捷,你說我怎么就攤上這事」拚” “怎么了靡挥?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸯绿。 經(jīng)常有香客問我跋破,道長,這世上最難降的妖魔是什么瓶蝴? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任幔烛,我火速辦了婚禮,結(jié)果婚禮上囊蓝,老公的妹妹穿的比我還像新娘饿悬。我一直安慰自己,他們只是感情好聚霜,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布狡恬。 她就那樣靜靜地躺著珠叔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弟劲。 梳的紋絲不亂的頭發(fā)上祷安,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音兔乞,去河邊找鬼汇鞭。 笑死,一個胖子當(dāng)著我的面吹牛庸追,可吹牛的內(nèi)容都是我干的霍骄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼淡溯,長吁一口氣:“原來是場噩夢啊……” “哼读整!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咱娶,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤米间,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膘侮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屈糊,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年琼了,在試婚紗的時候發(fā)現(xiàn)自己被綠了另玖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡表伦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慷丽,到底是詐尸還是另有隱情蹦哼,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布要糊,位于F島的核電站纲熏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锄俄。R本人自食惡果不足惜局劲,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奶赠。 院中可真熱鬧鱼填,春花似錦、人聲如沸毅戈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚袍。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敲茄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工誉碴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留厦幅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓施流,卻偏偏與公主長得像响疚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫂沉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容