js的垃圾收集機制之理解

我們先了解一下什麼是內存泄漏?

我們創建基本類型、對象、函數……所有這些都需要內存。程序的運行需要內存,只要程序提出要求,操作系統或者運行是就必須供給內存。所謂的內存泄漏簡單來說是不再用到的內存,沒有及時釋放

舉幾個例子:
比如使用EventBus,肯定是要執行register(),那麼在Fragment或Activity finish的時候,一定不要忘記執行unregister()方法

如果兩個對象相互引用,儘管他們已不再使用,垃圾回收不會進行回收,導致內存泄露。

垃圾回收機制

  • 什麼是垃圾回收機制?

在C語言中,開發人員需要可以手動控制內存的申請和回收,但是在Java、C#、JavaScript語言中,所有的內存分配以及回收都會由垃圾回收器自動完成

JavaScript垃圾回收的機制很簡單:找出不再使用的變量,然後釋放掉其佔用的內存,但是這個過程不是時時的,因爲其開銷比較大,所以垃圾回收器會按照固定的時間間隔週期性的執行

  • 垃圾回收機制的作用和好處

爲了避免內存泄漏

  • 垃圾回收機制的場景

  • 代碼示例


  function test1(){
      var i ={name:'nyf'};
  }
  function test2(){
      var i ={name:'nyf'};
      return i;
  }
  var m1 = test1();
  var m2 = test2();

  一般來說在e.g.1中,當 test1調用時,進入 test1 的環境,那麼內存中會開闢存放 {name:’nyf’} 對象的內存,當調用結束後,出了 test1 的環境,那麼該內存會被JS引擎中的垃圾回收器自動釋放其內存。

  在test2中,對象被返回,並且被變量 m2 所指向,所以雖然說在調用完 test2 後出了其環境,但是由於m2仍然持續着對對象的鏈接關係,所以該對象不會被釋放。

變量的生命週期
當一個變量的生命週期結束之後它所指向的內存就應該被釋放。JS有兩種變量,全局變量和在函數中產生的局部變量。局部變量的生命週期在函數執行過後就結束了,此時便可將它引用的內存釋放(即垃圾回收),但全局變量生命週期會持續到瀏覽器關閉頁面。

內存分配策略:

靜態分配:主要存放靜態數據,全局 static 數據 和 常量。 且該塊內存在編譯的時候已經確定了,而且在程序運行期間都是存在的
棧區:當方法被執行的時候,即他會被放在棧的頂部,且方法內的局部變量都會在棧內被創建,並且在方法執行完後回收,因爲棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
堆區:又稱爲動態內存分配,主要儲存對象(即new出來的對象),如果存在不使用的對象,就可以GC掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章