最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS前端性能優(yōu)化解決內(nèi)存泄漏頁面崩潰

 更新時間:2022年07月19日 17:11:16   作者:瓶蓋兒1  
這篇文章主要為大家介紹了JS前端性能優(yōu)化解決內(nèi)存泄漏頁面崩潰示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

發(fā)生什么事了?

一個與往常一樣的上午,當我沉浸在業(yè)務(wù)需求中不可自拔時,突然被拉入到一個事故大群。一臉懵逼的我還以為和之前的每次線上bug一樣僅僅是個小問題時,殊不知是我簡單了...

看著群里的聊天記錄,瞬間一種不好的預(yù)感涌上心頭。不會是哪個頁面寫了死循環(huán)了吧?

咋了?這是咋了?

死去的頁面突然攻擊我?

因為項目本身過于龐大,且用戶反饋不特定頁面崩潰,這使得問題定位難度較大。

經(jīng)過團隊的討論認為可能是該用戶的組織架構(gòu)接口數(shù)據(jù)量過大,當數(shù)據(jù)到達頁面后需要經(jīng)過遞歸處理,導致內(nèi)存不足,且通過調(diào)試發(fā)現(xiàn)并非初次調(diào)用該接口就會導致崩潰,而是需要多次調(diào)用才會出現(xiàn)該問題。

而且在調(diào)試的過程中還發(fā)現(xiàn)因數(shù)據(jù)量過大,該接口需要長達 30s 的時間才能返回。而這么長的時間用戶可能已經(jīng)離開這個頁面了。我們嘗試以這個場景進行操作發(fā)現(xiàn),用戶離開頁面并沒有取消已經(jīng)發(fā)出的請求,當該請求響應(yīng)后會導致內(nèi)存占用飆升。

因該接口為項目全局接口,經(jīng)過討論我們決定先修復(fù)這個離開頁面不取消請求的問題,測試能否解決崩潰問題。

陷入僵局

當我們在離開頁面時取消未完成的請求后,測試反饋仍然會不定時崩潰,此時的我們有點無從下手了。因為我們發(fā)現(xiàn)問題貌似有點大了。

此時我們已經(jīng)開始懷疑出現(xiàn)了內(nèi)存泄漏,于是我們祭出了 chrome-devtool 使用 Memory 來進行內(nèi)存占用分析。

經(jīng)過內(nèi)存分析發(fā)現(xiàn),內(nèi)存中存在大量的分離元素未能及時回收。我按照內(nèi)存快照的指引開始了漫長的修改。兩天的修改后發(fā)現(xiàn),雖然修復(fù)了不少的問題,但是仍然不能有效的降低頁面的內(nèi)存占用,每當我們跳轉(zhuǎn)新的頁面時某些頁面仍然不能正常釋放。此時我為了高效定位問題,開始使用絕招——刪代碼。

  • 將頁面中的組織架構(gòu)樹刪除——內(nèi)存占用沒降下來...

  • 將頁面的列表刪除——很棒空頁面果真降下來了

  • 將組織架構(gòu)樹加上,列表刪除——內(nèi)存又起來了...

此時的我認為組織架構(gòu)樹的寫法有問題,所以花了兩天的時間過了一遍組織架構(gòu)樹的代碼,未發(fā)現(xiàn)有什么異常的地方。

為了確認是組織架構(gòu)樹的問題還是頁面列表的問題,我在項目中新建了兩個空白的路由頁面。在這個頁面中單獨使用這兩個組件,都沒有問題。

問題陷入了僵局...

垂死病中驚坐起

在我們修復(fù)這個問題的期間,另一個用戶也反饋了相同的問題過來,不過用戶說他用的是edge瀏覽器。此時同事說edge好像可以撐的更久一點。??哇,真的嗎?難道和瀏覽器有關(guān)系?

于是我又打開了edge瀏覽器,點開了devtool點開了Memory...哎?這是什么

edge的devtool這么好嗎,專門有獨立的標簽用來查找分離的元素啊,蠻人性化的嘛??墒沁@和chrome不一樣呀,咋用呢?(戳這里)

它真的好智能,竟然已經(jīng)把所有泄漏的dom按照結(jié)構(gòu)組織好了,這樣就不用我再從一堆內(nèi)存信息中一個個找它們的關(guān)聯(lián)關(guān)系了。

從上圖我發(fā)現(xiàn)原來是有一個全局的tip()方法導致了整個頁面沒能正?;厥眨脩裘窟M一次這個頁面就會在內(nèi)存里多一份這個頁面的dom節(jié)點。而這個頁面又有完整的組織架構(gòu)樹,組織架構(gòu)樹又很大...

查看了tip()方法的源碼發(fā)現(xiàn),這是一個全局的指令,這個指令每次都會創(chuàng)建一個新的tip對象,而這個tip對象與頁面上的dom節(jié)點關(guān)聯(lián),且永遠不會被銷毀。

類似的問題在列表中有個對表格行拖拽排序的功能,使用了第三方包sortablejs而未調(diào)用destory()方法銷毀sortable 實例,進而導致表格與頁面也未能正確釋放。

勿以善小而不為

到此,大概的原因已經(jīng)明確了。未及時銷毀的無用對象導致了大面積的內(nèi)存泄漏,疊加用戶的配置較低(8G內(nèi)存,且開啟了很多頁面),導致了頁面的崩潰。

類似以上的問題在本次修復(fù)中還發(fā)現(xiàn)不少,如:

  • 公共彈窗組件將傳入的子組件持有,在關(guān)閉彈窗后未能銷毀子組件。
  • 全局的EventBus實例未及時調(diào)用$off方法銷毀事件,而事件回調(diào)與頁面又產(chǎn)生關(guān)聯(lián)(如:$refs、$parents)
  • 組件接受來自頁面的方法,而該組件未能在頁面離開時銷毀(如在組件內(nèi)將組件的this綁定在window上),導致整個頁面不能釋放
  • 為了在頁面resize時能夠調(diào)節(jié)echarts大小,在window上綁定了resize回調(diào),離開頁面時為清除resize事件
  • 組件實例化時在document上綁定click事件后,銷毀組件時為清除click事件

以上的每一個問題都是小問題,僅僅是因為沒用在beforeDestroy中調(diào)用Element.removeEventListener()或者未調(diào)用destroy()方法。但是會導致很大的后患。

修復(fù)后的頁面已經(jīng)能夠達到較為正常的內(nèi)存占用了,在此給大家放一張測試同學提供的修復(fù)前后的內(nèi)存占用對比圖,相較于修復(fù)前的內(nèi)存占用只增不減(峰值4G,然后崩潰)到現(xiàn)在的能及時回收(最復(fù)雜的頁面峰值500M,普通頁面100M以內(nèi)),已經(jīng)有了極大的提升。

修改參考

const handleResizeWindow = () => {
    myChart.resize();
}
window.addEventListener("resize", handleResizeWindow);
this.$once('hook:beforeDestroy', () => {
    myChart.dispose() // 銷毀echart實例
    window.removeEventListener('resize', handleResizeWindow)
})
created () {
    window.removeEventListener('beforeunload', this.closePage)
},
...
beforeDestroy () {
    window.removeEventListener('beforeunload', this.closePage)
}
 mounted() {
     this.$eventBus.$on("eventName", this.handleEvent);
     this.$once('hook:beforeDestroy', () => {
         this.$eventBus.$off('eventName', this.handleEvent)
     })
 }

以上就是JS前端性能優(yōu)化解決內(nèi)存泄漏頁面崩潰的詳細內(nèi)容,更多關(guān)于JS內(nèi)存泄漏頁面崩潰的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序 video組件詳解

    微信小程序 video組件詳解

    這篇文章主要介紹了微信小程序 video組件詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 5個實用的JavaScript新特性

    5個實用的JavaScript新特性

    這篇文章主要為大家介紹了5個實用的JavaScript新特性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 微信小程序 兩種為對象屬性賦值的方式詳解

    微信小程序 兩種為對象屬性賦值的方式詳解

    這篇文章主要介紹了微信小程序 兩種為對象屬性賦值的方式詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JavaScript編程中實現(xiàn)對象封裝特性的實例講解

    JavaScript編程中實現(xiàn)對象封裝特性的實例講解

    JavaScript可以在一定程度上以面向?qū)ο蠓绞竭M行編程,而封裝是面向?qū)ο笾械囊粋€重要特性,本文就來分享阮一峰老師對JavaScript編程中實現(xiàn)對象封裝特性的實例講解
    2016-06-06
  • Typescript類型系統(tǒng)FLOW靜態(tài)檢查基本規(guī)范

    Typescript類型系統(tǒng)FLOW靜態(tài)檢查基本規(guī)范

    這篇文章主要為大家介紹了Typescript語言的類型系統(tǒng)FLOW靜態(tài)檢查基本規(guī)范,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 微信小程序-拍照或選擇圖片并上傳文件

    微信小程序-拍照或選擇圖片并上傳文件

    這篇文章主要介紹了微信小程序-拍照或選擇圖片并上傳文件的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 上傳頭像的實例詳解

    微信小程序 上傳頭像的實例詳解

    這篇文章主要介紹了微信小程序 上傳頭像的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • 實現(xiàn)微信小程序的wxml文件和wxss文件在webstrom的支持

    實現(xiàn)微信小程序的wxml文件和wxss文件在webstrom的支持

    這篇文章主要介紹了實現(xiàn)微信小程序的wxml文件和wxss文件在webstrom的支持的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • js 數(shù)組 fill() 填充方法

    js 數(shù)組 fill() 填充方法

    這篇文章主要介紹了js 數(shù)組 fill() 的填充方法,初始化數(shù)組的方法,但是初始化數(shù)組之后,數(shù)組中的每一項元素默認為 empty 空位占位,如何對數(shù)組這些空位添加默認的元素,ES6提供了 fill() 方法實現(xiàn)這一操作。本文總結(jié)數(shù)組 fill() 方法的詳細使用,需要的朋友可以參考一下
    2021-10-10
  • 微信小程序 開發(fā)指南詳解

    微信小程序 開發(fā)指南詳解

    這篇文章主要介紹了微信小程序 開發(fā)指南詳解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評論

岫岩| 常宁市| 体育| 华亭县| 兴宁市| 德兴市| 六盘水市| 义乌市| 固安县| 岢岚县| 普兰县| 永泰县| 彰武县| 双柏县| 建阳市| 襄垣县| 梁河县| 中江县| 金平| 开江县| 绥滨县| 长治县| 遂溪县| 镇宁| 儋州市| 襄垣县| 常德市| 二连浩特市| 任丘市| 尚志市| 乌鲁木齐市| 泸州市| 新源县| 保康县| 申扎县| 图片| 沙洋县| 封开县| 石门县| 治多县| 韩城市|