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. 老生代的回收
老生代的回收策略主要是標記清除和標記整理。
標記清除:主要是兩個步驟,標記和清除。首先遍歷老生代的對象,判斷對象是否被其餘對象引用,有的話標記,沒有的話進入清除階段,把全部未被標記的對象清楚。
標記整理:因爲在標記清除階段不少清除了以後,對象的內存不是連續的,致使不少很大對象來了以後沒有內存能夠用。這時標記整理就發揮做用了。