### 回收機制
JS有垃圾處理器,所以無需手動回收內存,而是由垃圾處理器自動處理。
一般來說,垃圾處理器有自己的回收策略。
譬如對于那些執行完畢的函數,如果沒有外部引用(被引用的話會形成閉包),則會回收。(當然一般會把回收動作切割到不同的時間段執行,防止影響性能)
常用的兩種垃圾回收規則是:
- 標記清除
- 引用計數
Javascript 引擎基礎GC方案是(`simple GC`):`mark and sweep`(標記清除),簡單解釋如下:
1. 遍歷所有可訪問的對象。
2. 回收已不可訪問的對象。
譬如:(出自 javascript 高程)
> 當變量進入環境時,例如,在函數中聲明一個變量,就將這個變量標記為“進入環境”。
>
> 從邏輯上講,永遠不能釋放進入環境的變量所占用的內存,因為只要執行流進入相應的環境,就可能會用到它們。
>
> 而當變量離開環境時,則將其標記為“離開環境”。
>
> 垃圾回收器在運行的時候會給存儲在內存中的所有變量都加上標記(當然,可以使用任何標記方式)。
>
> 然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記(閉包,也就是說在環境中的以及相關引用的變量會被去除標記)。
>
> 而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。
>
> 最后,垃圾回收器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。
關于引用計數,簡單點理解:
**跟蹤記錄每個值被引用的次數,當一個值被引用時,次數 +1,減持時 -1,下次垃圾回收器會回收次數為0的值的內存(當然了,容易出循環引用的bug)**
**GC的缺陷**
和其他語言一樣,javascript 的 GC 策略也無法避免一個問題: **GC 時,停止響應其他操作**
這是為了安全考慮。
而 Javascript 的 GC 在`100ms`甚至以上
對一般的應用還好,但對于JS游戲,動畫對連貫性要求比較高的應用,就麻煩了。
這就是引擎需要優化的點: **避免GC造成的長時間停止響應。**
**GC優化策略**
這里介紹常用到的:**分代回收(Generation GC)**
目的是通過區分“臨時”與“持久”對象:
- 多回收“臨時對象”區(`young generation`)
- 少回收“持久對象”區(`tenured generation`)
- 減少每次需遍歷的對象,從而減少每次GC的耗時。
像node v8引擎就是采用的分代回收(和 java 一樣,作者是 java 虛擬機作者。)
更多可以參考:[V8 內存淺析](https://zhuanlan.zhihu.com/p/33816534)
- Web 開發筆記
- 從輸入 URL 到頁面加載完成的過程中都發生了什么事情?
- 從瀏覽器接收url到開啟網絡請求線程
- 開啟網絡線程到發出一個完整的http請求
- 從服務器接收到請求到對應后臺接收到請求
- 后臺和前臺的http交互
- http的緩存
- 解析頁面流程
- HTML解析,構建DOM
- CSS解析,構建CSSOM
- 資源外鏈的下載
- CSS的可視化格式模型
- 包含塊(Containing Block)
- 控制框(Controlling Box)
- BFC(Block Formatting Context)
- IFC(Inline Formatting Context)
- 其它
- JS引擎解析過程
- JS的解釋階段
- JS的預處理階段
- JS的執行階段
- 回收機制
- 參考資料
- JavaScript模塊化編程
- AMD
- requireJS
- CommonJS
- UMD
- ES6模塊
- 參考資料
- 使用 JavaScript 實現一門編程語言
- 如何使用 JavaScript 實現一門編程語言(1) —— 前言
- 如何使用 JavaScript 實現一門編程語言(2) —— 編寫一個解析器
- 如何使用 JavaScript 實現一門編程語言(3) —— Input stream
- 如何使用 JavaScript 實現一門編程語言(4) —— Token stream
- 如何使用 JavaScript 實現一門編程語言(5) —— AST
- 如何使用 JavaScript 實現一門編程語言(6) —— Interpreter
- 完整代碼
- 參考資料
- 前端布局概論
- 參考資料
- Windows 筆記
- 錯誤解決
- win10應用商店無法登錄提示0x80070426解決方法
- 使用技巧
- 設置 Hyper-V 和 VMware 共存
- Powershell
- WSL