亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue單頁應用的內存泄露定位和修復問題小結

2019-11-19 11:05:19
字體:
來源:轉載
供稿:網友

在前端項目(PC端)中,內存泄露的定位往往比修復更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復雜的引用關系,開發則依然很難快速定位到問題代碼塊。

一、什么是內存泄漏?

系統進程不再用到的內存,沒有及時釋放,就叫做內存泄漏(memory leak)。當內存占用越來越高,輕則影響系統性能,重則導致進程崩潰。Chrome限制了瀏覽器所能使用的內存極限(64位為1.4GB,32位為1.0GB),這也就意味著瀏覽器將無法直接操作一些大內存對象。

V8引擎在執行垃圾回收時會阻塞 JavaScript應用邏輯,直到垃圾回收結束再重新執行JavaScript應用邏輯,這種行為被稱為“全停頓”(stop-the-world)。 若V8的堆內存為1.5GB,V8做一次小的垃圾回收需要50ms以上,造成假死現象。

二、JS內存管理和垃圾回收機制GC

高級語言基本都有垃圾回收機制(garbage collection)自動管理內存,降低程序員的負擔,以達到解決內存泄漏的目的,但是不允許人為手動觸發,無法對內存管理進行任何干預。

老版本的瀏覽器使用引用計數法(Reference Counting)來管理內存,即每次引用加一,被釋放時減一,當這個值的引用次數變成 0 時,就可以將其內存空間回收,缺點是循環引用時無法回收。

現代瀏覽器基本采用標記清除法(Mark-and-Sweep)來管理內存,即瀏覽器周期性地從某個根元素(譬如 window 對象)開始找引用變量,及這些變量引用的變量,這樣一直找下去。能找到的變量為可獲得變量,不能找到的將被內存回收。


缺點是清除后內存會產生很多細化的分塊,所以又衍生了標記-整理法,不細講。

三、VUE中容易出現內存泄露的幾種情況

內存泄露是一個累積的過程,只有頁面生命周期略長的時候才暴露出問題,頻繁交互能夠加快累積的過程,偏展示的頁面很難把這樣的問題暴露出來(所謂刷新一下又能滿血復活)。所以很多時候我們都是被動式的等待問題暴露然后進行排查的,主動式的分析通常比較難。vue頁面大多是單頁應用,高交互且停留時間久,處理不好很容易出現內存泄漏。本文章 主要針對游離的dom對象進行排查 ,普通的JS變量排查有時間再補充。

1.全局變量造成的內存泄露

<template> <div id="home">  這里是首頁 </div></template><script>export default { mounted () {  window.test = { // 此處在全局window對象中引用了本頁面的dom對象   name: 'home',   node: document.getElementById('home')  } }}</script>

按下Heap snapshots鍵,搜索Detached,發現沒有脫離文檔樹的dom元素,屬于正?,F象

改變路由跳轉到other頁面,按下Heap snapshots鍵,搜索Detached,發現有兩處dom元素游離于當前頁面之外,很明顯是window對象引用了home頁面中的div,即使此時home頁面已經銷毀,home中的dom元素卻還駐留在內存中無法釋放。

解決方案就是在頁面卸載的時候順便處理掉該引用。

<template> <div id="home">  這里是首頁 </div></template><script>export default { mounted () {  window.test = { // 此處在全局window對象中引用了本頁面的dom對象   name: 'home',   node: document.getElementById('home')  } }, destroyed () {  window.test = null // 頁面卸載的時候解除引用 }}</script>

2.除了直接引用,window的原生方法也會起到引用dom元素使其無法釋放的效果。

<template> <div id="home">這里是首頁</div></template><script>export default { mounted () {  window.addEventListener('resize', this.func) // window對象引用了home頁面的方法 }, methods: {  func () {   console.log('這是home頁面的函數')  } }}</script>

 解決方法一樣,也是在頁面銷毀的時候,順便解除引用,釋放內存

mounted () {  window.addEventListener('resize', this.func)},beforeDestroy () {  window.removeEventListener('resize', this.func)}

3.一些全局的方法使用不當也會造成內存無法釋放,在頁面卸載的時候也可以考慮解除引用

<template> <div id="home">這里是首頁</div></template><script>export default { mounted () {  this.$EventBus.$on('homeTask', res => this.func(res)) }, methods: {  func (res) {   console.log(res)  } }}</script>

mounted () { this.$EventBus.$on('homeTask', res => this.func(res))},destroyed () { this.$EventBus.$off()}

造成游離dom節點的原因還有很多,不止這三種,總結起來:

1.window對象、事件總線、全局vuex上綁定了已銷毀頁面上的節點,到時節點不隨頁面一起銷毀

2.使用第三方庫創建實例,第三方庫一般會提供銷毀函數,頁面跳轉時沒有調用正確的銷毀函數

3.有同學會說在頁面中使用閉包也會造成內存泄露,在vue框架里有管理內存的機制,只要按照它的正確編寫方法,理論上是不會造成內存泄露的

總結

以上所述是小編給大家介紹的vue單頁應用的內存泄露定位和修復問題小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
裸体女人亚洲精品一区| 久久久欧美精品| 亚洲日韩中文字幕在线播放| 91香蕉亚洲精品| 成人亲热视频网站| 中文字幕日韩在线播放| 久久夜精品香蕉| 国产精品入口尤物| 91国内免费在线视频| 国产欧美日韩精品在线观看| 国产精品99久久久久久人| 亚洲人成毛片在线播放| 欧美性猛交xxxx富婆| 丝袜亚洲另类欧美重口| 日韩视频在线一区| 国内精品久久久久久久| 欧美午夜影院在线视频| 另类少妇人与禽zozz0性伦| 亚洲女人天堂色在线7777| 亚洲精品国产免费| 日韩麻豆第一页| 92国产精品视频| 在线播放日韩精品| 欧美xxxx14xxxxx性爽| 国内精品久久久久伊人av| 亚洲在线观看视频网站| 日韩av电影免费观看高清| 欧美日韩裸体免费视频| 国产精品精品久久久久久| 成人欧美一区二区三区在线| 日韩精品免费在线播放| 91精品在线播放| 92看片淫黄大片欧美看国产片| 国产一区二区动漫| 91精品久久久久久久久久另类| 亚洲精品自产拍| 欧美日韩亚洲视频| 午夜免费在线观看精品视频| 91手机视频在线观看| 亚洲激情在线观看| 欧美xxxx18性欧美| 国外成人性视频| 亚洲第一免费播放区| 国产成人精品综合久久久| 日韩国产欧美区| 国产精品青青在线观看爽香蕉| 久久伊人精品天天| 国产精品欧美激情在线播放| 国产精品对白刺激| 色偷偷91综合久久噜噜| 一区二区三区 在线观看视| 成人黄色片网站| 中文字幕综合在线| 国产日产欧美a一级在线| 日韩福利视频在线观看| 日韩小视频在线| 亚洲精品一区二区三区不| 国产精品美女久久| 欧美性生交xxxxx久久久| 91精品国产免费久久久久久| 日韩电影中文字幕在线| 热99精品只有里视频精品| 国产99久久精品一区二区| 欧美激情在线视频二区| 亚洲美女av电影| 国产午夜精品久久久| 亚洲图片欧美午夜| 日韩中文字幕亚洲| 色播久久人人爽人人爽人人片视av| 在线观看亚洲视频| 日韩精品极品视频| 亚洲欧洲日产国产网站| 精品国内自产拍在线观看| 成人性生交xxxxx网站| 久久久精品在线| 国产精品一区二区av影院萌芽| 国产99久久精品一区二区| 日韩在线观看视频免费| 欧美成人黑人xx视频免费观看| 亚洲一级一级97网| 欧美性猛交xxxx偷拍洗澡| 日韩中文字幕网址| 91亚洲精品久久久久久久久久久久| 国产精品扒开腿做爽爽爽男男| 久久影院资源网| 国产精品2018| 97精品视频在线| 疯狂做受xxxx欧美肥白少妇| 国产精品中文字幕在线观看| 亚洲欧洲第一视频| 91超碰中文字幕久久精品| 亚洲午夜精品久久久久久久久久久久| 这里只有精品视频在线| 欧美超级乱淫片喷水| 欧美专区中文字幕| 2020久久国产精品| 欧美极品少妇xxxxⅹ喷水| 国产精品va在线| 日韩一区二区三区在线播放| 欧美乱大交xxxxx| 裸体女人亚洲精品一区| 欧美日韩亚洲一区二| 国产精品视频一区国模私拍| 欧美激情在线视频二区| 欧美亚洲激情视频| 国产欧洲精品视频| 在线免费观看羞羞视频一区二区| 国产精品男人爽免费视频1| 日韩在线高清视频| 国产成人精品一区二区三区| 国内精品久久久久久中文字幕| 91精品国产91久久久久久久久| 黄色一区二区三区| 欧美性猛xxx| 日韩毛片中文字幕| 久久亚洲国产精品成人av秋霞| 91久热免费在线视频| 亚洲国产黄色片| 国产亚洲激情视频在线| 91福利视频在线观看| 一本一道久久a久久精品逆3p| 久久久99久久精品女同性| 一区二区在线视频| 国产精品白嫩美女在线观看| 亚洲精品99久久久久中文字幕| 欧美夫妻性视频| 国产欧美日韩最新| 国产精品久久久久久久久久东京| 欧美日韩国产丝袜美女| 久久久久久久爱| 欧美国产日韩一区二区三区| 国产乱人伦真实精品视频| 亚洲一区亚洲二区亚洲三区| 97国产精品免费视频| 欧美成人精品在线| 日本成人精品在线| 亚洲精品自拍偷拍| 亚洲色图13p| 久久精品99久久香蕉国产色戒| 久久久欧美精品| 亚洲成色999久久网站| 久久久免费在线观看| 午夜精品久久久久久久白皮肤| 久久久国产精品亚洲一区| 欧美成人激情图片网| 久久久综合免费视频| 成人免费自拍视频| 亚洲三级av在线| 亚洲一区美女视频在线观看免费| 国产精品高潮呻吟视频| 亚洲精品一二区| 97视频人免费观看| 国产美女精彩久久| 国产a∨精品一区二区三区不卡| 中文字幕日韩欧美| 国产精品视频免费观看www| 精品女同一区二区三区在线播放| 欧美一级视频一区二区| 国产精品吊钟奶在线| 97免费中文视频在线观看| 亚洲精品久久视频| 最新的欧美黄色| 久久精品91久久香蕉加勒比| 成人午夜激情免费视频|