v8引擎--垃圾回收機制--Mr.Ember

v8引擎--垃圾回收機制java

摘要: node

 編程語言分爲編譯型語言和解釋型語言,編譯型語言執行速度要超過解釋型語言。首先javasrcipt是一個解釋型語言,解釋型語言就是邊編譯邊執行,因此執行速度相對較慢。v8引擎主要就是爲了加快瀏覽器執行js的速度。node中也是使用了v8引擎來加快js的執行。算法

下面主要是介紹V8的垃圾回收機制編程

 

1. v8內存限制瀏覽器

node在32位機器上只有0.7GB內存,64位上有1.4GB。爲什麼限制內存的大小呢?是由於v8有垃圾回收機制。怎麼才能突破限制,經過JVM來修改內存的大小。能夠修改新生代和老生代的大小。編程語言

你們可能不瞭解什麼是新生代和老生代,下面會爲你們介紹👇spa

 

2. 如何判斷回收內容指針

 若是一個對象不知足下面條件的,將會被回收對象

 (1)非根對象被其餘對象引用ip

 (2)瀏覽器中對象被window引用

 (3)node中對象被global對象引用

 

3. v8的回收策略

 內存被分爲新生代和老生代。新生代存儲通常是活躍對象,瀏覽器對新生代的回收也是比較頻繁。新生代中對象在知足某些條件後,會晉升爲老生代。

 兩個生代的大小和回收算法都是不一樣的。

 

4. 新生代的回收策略

 新生代的回收策略是經過scavenge中的Cheney算法實現的,這個算法主要是經過複製實現的。新生代內存主要分爲兩個區,From區(被使用的)和To區(閒置的),這個兩個區主要就是進行來回複製。新生代的回收主要的實現步驟以下:

 (1)對象首先被分到From區

 (2)檢查對象是不是活躍對象,有的話直接複製到To區

 (3)To區有兩個指針:scanPtr和allocationPtr  scanPtr主要是指向即將掃描的活躍對象  allocationPtr是爲即將成爲新對象分配內存

 

5. 新生代對象的晉升

 (1)從From區到To區,檢查對象的內存地址是否經歷過新生代的清理。

 (2)對象從From區到To區,發現To區空間已經被使用超過25%,則對象將直接被分配到老生代

 

6. 老生代的回收

 老生代的回收策略主要是標記清除和標記整理。

 標記清除:主要是兩個步驟,標記和清除。首先遍歷老生代的對象,判斷對象是否被其餘對象引用,有的話標記,沒有的話進入清除階段,把全部未被標記的對象清楚。

 標記整理:因爲在標記清除階段不少清除了以後,對象的內存不是連續的,致使不少很大對象來了以後沒有內存能夠用。這時標記整理就發揮做用了。

相關文章
相關標籤/搜索