国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript 內(nèi)存泄漏

這篇具有很好參考價(jià)值的文章主要介紹了JavaScript 內(nèi)存泄漏。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

內(nèi)存的釋放流程:

  1. 分配內(nèi)存
  2. 內(nèi)存中的讀寫
  3. 垃圾回收

對(duì)于內(nèi)存的使用,所有語言基本都是一樣的,只是更底層的語言在對(duì)于 ”分配內(nèi)存“ 和 ”使用內(nèi)存“ 是明確的,但是在高級(jí)語言中(比如本文的 JS)是隱藏了。
JS 中在定義一個(gè)變量時(shí),就已經(jīng)分配好了一個(gè)內(nèi)存;
同時(shí),內(nèi)部也提供好了垃圾回收的機(jī)制,回收那些已經(jīng)不再使用的內(nèi)存。

原理:

  • 當(dāng)我們定義了一個(gè)變量后,這個(gè)變量就會(huì)被垃圾回收機(jī)制所標(biāo)記;
  • 當(dāng)一次程序執(zhí)行以后,如果這個(gè)變量依然存在引用,則垃圾回收機(jī)制會(huì)認(rèn)為:變量還在使用,不能釋放
  • 內(nèi)存泄漏的原因:程序任務(wù)一個(gè)變量已經(jīng)沒用了,可是垃圾回收機(jī)制認(rèn)為他還在使用,從而導(dǎo)致這段內(nèi)存無法釋放。
    • 這里需要注意的是:是程序?qū)@段內(nèi)存失去了控制權(quán)。
    • 內(nèi)存突然暴增,并不是內(nèi)存泄漏。

JavaScript 內(nèi)存泄漏

上圖中,我錄制了一個(gè)最基礎(chǔ)的內(nèi)存使用:在百度中(input)輸入文字,觸發(fā)高頻 change 事件:
JavaScript 內(nèi)存泄漏

于是我們得到了上圖中的這條監(jiān)聽內(nèi)存的曲線:

  • 這條藍(lán)色的線條中,我用黃色色圈出來的部分是手動(dòng)清理了內(nèi)存后,內(nèi)存驟降的兩個(gè)時(shí)機(jī)
  • 黃色圈出來的部分是指程序中,在我操作前后內(nèi)存的變化,可以看到這里錄制前后(停止輸入后)內(nèi)存的使用并沒有多出來內(nèi)存,說明這里的 GC 后內(nèi)存的控制在程序可掌控的范圍內(nèi)。

以上就是一個(gè)簡單的內(nèi)存完整釋放的例子。

那么有哪些場(chǎng)景容易造成內(nèi)存泄露呢?

一、全局變量

JavaScript 內(nèi)存泄漏

分析上圖,我們?cè)诮o window 變量設(shè)置了十萬個(gè)屬性,在這個(gè)全局變量下的內(nèi)存是不會(huì)被垃圾回收的,這里多出來的那一步分內(nèi)存就是程序失去對(duì)這些變量控制權(quán)的部分:
JavaScript 內(nèi)存泄漏
所以意外的全局變量泄露

二、console.log()

JavaScript 內(nèi)存泄漏
上圖執(zhí)行一段打印邏輯;

將上述結(jié)果放大后,可以清晰的看到,兩次清理 GC 后,內(nèi)存得到了一定的釋放,但是有超出的那一部分內(nèi)存造成了內(nèi)存泄漏:
JavaScript 內(nèi)存泄漏
console.log 也是全局變量

這也是為什么,生產(chǎn)環(huán)境中都會(huì)要求刪除 console 的原因了
當(dāng)然,讓客戶看到 console 丟人也是一個(gè)原因

三、閉包

閉包本身并不會(huì)造成內(nèi)存泄漏,沒有控制好閉包的使用,導(dǎo)致變量的引用無法被回收才是閉包導(dǎo)致內(nèi)存泄漏的原因。

JavaScript 內(nèi)存泄漏

直接看兩次清除 GC 后的情況:JavaScript 內(nèi)存泄漏
可以看到第二次清除 GC 后,依然有一部分內(nèi)存沒有得到釋放,這部分就是閉包引用導(dǎo)致的內(nèi)存泄漏。
而常規(guī)的閉包引用的函數(shù)執(zhí)行并不會(huì)造成內(nèi)存泄漏。

四、Dom 泄漏

現(xiàn)代的前端框架幾乎都不推薦直接操作 dom 了,因?yàn)?dom 也是對(duì)象,創(chuàng)建的 dom 對(duì)象在被使用后,沒有及時(shí)清理掉也會(huì)造成一定程度的內(nèi)存泄漏。

總結(jié)

所謂內(nèi)存泄漏就是程序執(zhí)行完了,本該隨著程序執(zhí)行結(jié)束而被釋放的內(nèi)存由于有著引用關(guān)系而未得到釋放導(dǎo)致的內(nèi)存占用問題。

小結(jié)一下防止內(nèi)存泄漏的幾個(gè)方面:文章來源地址http://www.zghlxwxcb.cn/news/detail-430697.html

  1. 清除不必要的引用
  2. 盡量不要定義全局變量(比如減少 var 操作符的使用)
  3. 提交代碼前刪除 console

到了這里,關(guān)于JavaScript 內(nèi)存泄漏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【項(xiàng)目設(shè)計(jì)】高并發(fā)內(nèi)存池(五)[釋放內(nèi)存流程及調(diào)通]

    【項(xiàng)目設(shè)計(jì)】高并發(fā)內(nèi)存池(五)[釋放內(nèi)存流程及調(diào)通]

    ??C++學(xué)習(xí)歷程:入門 博客主頁: 一起去看日落嗎 持續(xù)分享博主的C++學(xué)習(xí)歷程 博主的能力有限,出現(xiàn)錯(cuò)誤希望大家不吝賜教 分享給大家一句我很喜歡的話: 也許你現(xiàn)在做的事情,暫時(shí)看不到成果,但不要忘記,樹??成長之前也要扎根,也要在漫長的時(shí)光??中沉淀養(yǎng)分。靜

    2024年02月02日
    瀏覽(21)
  • Java中的內(nèi)存溢出與內(nèi)存泄漏深度解析

    目錄 引言 一. 內(nèi)存溢出(Memory Overflow) 1.1 堆內(nèi)存溢出 1.2 棧內(nèi)存溢出 1.3?內(nèi)存溢出的解決策略 1.3.1 優(yōu)化對(duì)象的創(chuàng)建和銷毀 1.3.2?調(diào)整堆內(nèi)存大小 1.3.3??使用內(nèi)存分析工具 1.3.4?避免創(chuàng)建過大的對(duì)象 1.3.5 定期清理不再使用的對(duì)象 二、 內(nèi)存泄漏(Memory Leak) 2.1Java內(nèi)存泄漏的典

    2024年02月19日
    瀏覽(23)
  • Python中的內(nèi)存泄漏及其檢測(cè)方法

    一、引言 內(nèi)存泄漏是編程中常見的問題之一,它會(huì)導(dǎo)致程序在運(yùn)行過程中不斷消耗內(nèi)存,最終可能導(dǎo)致程序崩潰或性能下降。在Python中,內(nèi)存泄漏也是一個(gè)需要關(guān)注的問題。本文將詳細(xì)介紹Python中的內(nèi)存泄漏及其檢測(cè)方法,以幫助讀者更好地理解和解決這個(gè)問題。 二、Pyth

    2024年02月22日
    瀏覽(26)
  • JVM—對(duì)象的創(chuàng)建流程與內(nèi)存分配

    JVM—對(duì)象的創(chuàng)建流程與內(nèi)存分配

    對(duì)象創(chuàng)建的流程圖如下: 內(nèi)存分配的方式有兩種: 指針碰撞(Bump the Pointer) 空閑列表(Free List) 分配方式 說明 收集器 指針碰撞(Bump the Pointer) 內(nèi)存地址是連續(xù)的(新生代) Serial和ParNew收集器 空閑列表(Free List) 內(nèi)存地址不連續(xù)(老年代) CMS收集器和Mark-Sweep收集器

    2024年04月10日
    瀏覽(31)
  • node內(nèi)存泄漏耗盡: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript

    node內(nèi)存泄漏耗盡: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript

    首先看到這種就是內(nèi)存泄漏,問題找準(zhǔn)了,接下來就是瘋狂百度,csdn搜索,試了3個(gè)方法,最后一個(gè)有用。 ? 執(zhí)行npm命令報(bào)錯(cuò):FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of me 字面意思:JavaScript堆內(nèi)存不足。因?yàn)镹ode 是基于V8引擎,在 Node 中通過

    2024年02月13日
    瀏覽(20)
  • C++多線程場(chǎng)景中的變量提前釋放導(dǎo)致棧內(nèi)存異常

    C++多線程場(chǎng)景中的變量提前釋放導(dǎo)致棧內(nèi)存異常

    在子線程中嘗試使用當(dāng)前函數(shù)的資源 ,是非常危險(xiǎn)的,但是C++支持這么做。因此C++這么做可能會(huì)造成棧內(nèi)存異常。 上述是一個(gè)正常的多線程代碼。 但是如果將其中多線程傳參設(shè)置為引用傳遞,可能就會(huì)造成棧內(nèi)存異常了,如下所示: 編譯成功,但是運(yùn)行失敗。 運(yùn)行結(jié)果:

    2024年02月13日
    瀏覽(43)
  • Golang中的New和Make:內(nèi)存分配與初始化的區(qū)別

    摘要:本文將深入探討Golang中的 New 和 Make 函數(shù)在內(nèi)存分配和初始化方面的區(qū)別。我們將通過理論闡述和示例代碼來解釋這兩個(gè)函數(shù)的作用,并幫助讀者更好地理解它們?cè)趯?shí)際編程中的應(yīng)用。 在Golang中, New 和 Make 是用于內(nèi)存分配和初始化的重要函數(shù)。雖然它們都涉及到內(nèi)存

    2024年02月08日
    瀏覽(18)
  • 探索Java中的靜態(tài)變量與實(shí)例變量:存儲(chǔ)區(qū)域、生命周期以及內(nèi)存分配方式的區(qū)別

    探索Java中的靜態(tài)變量與實(shí)例變量:存儲(chǔ)區(qū)域、生命周期以及內(nèi)存分配方式的區(qū)別

    ??歡迎來到Java面試技巧專欄~探索Java中的靜態(tài)變量與實(shí)例變量 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:Java面試技巧 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正?? ?? 歡迎大家關(guān)注! ?? 在Java中,靜態(tài)變量

    2024年02月12日
    瀏覽(28)
  • C語言中的字符串輸入(gets_s、fgets、scanf、fscanf)與相關(guān)內(nèi)存分配知識(shí)

    C語言中的字符串輸入(gets_s、fgets、scanf、fscanf)與相關(guān)內(nèi)存分配知識(shí)

    0. C語言的內(nèi)存分配知識(shí) 分配內(nèi)存空間有兩種方式:靜態(tài)內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配 0.1 靜態(tài)內(nèi)存分配 指的是在編譯時(shí)確定數(shù)組等數(shù)據(jù)類型的大小,然后由計(jì)算機(jī)分配好,通常是存在棧上的數(shù)據(jù) 例如:在聲明數(shù)組時(shí),需要顯示的指明數(shù)組的大小 0.2 動(dòng)態(tài)內(nèi)存分配 通俗一點(diǎn)就是向

    2024年02月11日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包