堆和棧


    堆內存

    每當定義一個變量、常量或者對象的時候,都會有一個存儲這些值的地方,這個地方就是內存堆;

    可用的內存是有限的,因此合理的使用內存是非常有必要的,像 c 語言是通過顯示的分配和釋放來合理的利用內存的;javascript 是通過垃圾回收機制來合理的處理內存的;

    v8引擎中,垃圾回收器的名字叫做:Orinoco

 

  標記和清除算法

    這一算法的工作方式是將對象標記為可獲得或者不可獲得,並將不可獲得的對象給清除掉;

    垃圾回收器周期性的從根部或者全局對象開始,移向被他們引用的對象,接着再移向被這些對象引用的對象,以此類推,所有不可獲得的對象會在之后被清除

 

  內存泄漏

    雖然垃圾回收器的效率很高,但是單憑一個算法並不能很好的去管理內存;

    經常容易出現內存泄漏的地方:

      1):全局變量:如果不斷的去創建全局變量,不管這些變量有沒有被應用,他們都是存在的,在程序的整個執行過程中,他們都會滯留在某一個空間內,如果這些變量是嵌套多層的對象,那么久會占用和浪費更多的內存;

      2):事件監聽器:在一個頁面中,我們可以回由於一些動畫效果等需求,使用到大量的監聽器,監聽一個事件的觸發,然后去實現一些效果,但是在用戶離開這個頁面的時候這些監聽器並沒有被移除掉,那么這個也是會造成內存的泄漏的;

      3):intervals 和 timeout:在使用定時器或者延時器的時候,我們經常會和必報一起使用,比如說去抖和節流使用的時候,在我們使用閉包的時候,有時候回去定義一些變量,但是我們在處理的時候經常會只是去清除了一下 intervals 或者 timeout 並沒有是清除這個閉包,這樣的話,沒有清除閉包,那么這些變量就也沒有被清除掉,其實這還是造成大量的變量引起的內存泄漏問題;

      4):DOM的清除和操作:我們在使用DOM 去進行一些操作的時候,有時候為了性能的考慮,我們會用一個變量去賦值這個DOM,這樣從另一方面,也是變量定義的一個過程,這樣這個變量就一直的存在了;

 

  調用棧

    棧是一種遵循LIFO(先進后出)的規則的數據結構,用於存儲和獲取數據;javascript 引擎通過棧來記住一個函數中最后執行的語句所在的位置

    例如: function multify(x) { return  x * 2}

       fucntion calSun() { const sum = 4 + 2 ;  return multify(sum) }

        calSum()

        1):引擎發現代碼中的兩個方法函數;

        2):運行 calSum() ;

        3):將 calSum() 壓棧,並執行 sum 和的計算;

        4):運行 multify() ;

        5):將 multify 壓棧,並執行 x * 2;

        6):在返回結果時,將 multify 從棧中彈出,然后回到 calSum() ;

        7):在 calSum 返回結果的時候,將calSum 從棧中彈出,然后繼續執行后面的代碼

 

  棧溢出

    在不對棧執行彈出的情況下,可連續壓棧的數目取決於棧的大小,如果超過了這個界限還不斷的壓棧,最終會導致棧溢出; chrome 瀏覽器將會拋出一個錯誤以及被稱為棧幀的棧快照。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM