在過去的幾個月,V8團隊一直致力于降低V8引擎內存消耗的工作,主要內容包括推出新的Ignition解釋器以及對V8解析器和編譯器的改進。來自V8的工程師Ulan Degenbaev、Michael Lippautz、Hannes Payer和Toon Verwaest說明了這次工作的主要目標之一是根據測試基準使用特別的工具對V8的內存使用情況進行分析。
為了減少V8的內存占用,V8團隊利用Chrome 54版本的新特性對V8引擎的兩個堆內存進行監控(C++堆和JavaScript堆)。Chrome的這個新特性提供了--trace--gc-object-stats標記,使用這個標記可以把V8的內存統計信息輸出到控制臺,然后使用V8 heap visualizer這個自制工具對輸出的信息進行可視化,它會把兩個堆的時間線視圖以及對特定數據類型內存使用情況的詳細分析結果展示出來。V8團隊還使用Chrome提供的另一個工具Trace Event Profiling Tool來分析內存,這個工具可以通過about:tracing來啟動。
內存分析的結果告訴我們,垃圾回收器的延遲和內存消耗之間的平衡是決定JavaScript堆內存大小的因素之一。為堆保留更多的內存可以避免頻繁的GC,從而減少延遲。不過這對于低內存的設備來說會是個問題,它會導致設備崩潰或讓應用程序掛起。為了達到延遲和內存消耗之間的平衡,V8團隊引入了一種新的內存縮減模式,這個模式會觸發更頻繁的垃圾回收,并通過更有效的壓縮來減少內存碎片。從一個測試基準可以看到,新的模式總共可以把V8堆內存縮減50%。引入的另一個優化措施是把V8的堆頁面大小從1M減到512K,有助于改善整體內存使用以及減少內存碎片。
V8團隊通過改進后臺的解析任務來減小C++的堆內存,這種改進可以讓V8在網頁加載過程中解析腳本。實際上,就像內存可視化工具所展示的那樣,后臺解析器會在代碼編譯后的很長一段時間內仍然保留著一塊活躍的堆區域,而不是馬上把它釋放掉。另外,V8解析器現在使用一種更有效的策略來壓縮保存在語法樹節點里的字段,而之前使用的是標準的C++壓縮。測試基準表明,峰值區域的內存縮減平均可以達到40%左右。
上面所描述的所有改進將出現在Chrome 55版本里,希望今年12月份可以放出。
查看英文原文:Profiling and Optimizing V8 Memory Consumption