垃圾回收与内存管理
垃圾回收機制
Javascript采用 自動垃圾收集機制,執行環境會負責跟蹤代碼執行過程中使用的內存,而在C和C++類的語言中,需要開發人員手工跟蹤內存的使用情況。
該機制的實現原理:找出那些不再繼續使用的變量,然后釋放其占用的內存,為此,垃圾收集器會按照固定的時間間隔周期性的執行這一操作。
javascript的垃圾回收機制會將變量分為兩大類:函數內的局部變量 和 非局部變量。因為,局部變量只在函數執行的過程中存在,在函數執行的過程中,為局部變量在棧或堆內存上分配相應的空間,函數執行完畢,釋放局部變量占用的內存空間,變量被銷毀;而對于非局部變量,垃圾收集器就需要跟蹤變量,判斷哪些沒用了,打上標記,這種標記策略因瀏覽器而異,通常有兩種。
1. 標記清除
垃圾收集器在運行的時候給存儲在內存中的所有變量都加上標記,然后,它會去掉執行環境中的變量和已經被環境引用的變量的標記。在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。最后,垃圾收集器完成內存清理工作。銷毀那些帶標記的值并回收他們所占用的內存空間。
到2008年為止,IE、Fireforx、Opera、Chrome和Safari采用的都是這種垃圾收集策略,只是收集的時間間隔不同。
2. 引用計數
引用計數的含義是跟蹤記錄每個值被引用的次數,當值的引用次數為0時,將其占用的內存空間回收,當垃圾收集器下次再運行時,它就會釋放那些引用次數為0的值所占用的內存。
但該方法存在一個很大的漏洞,當遇到循環引用(對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的指針)時,會出現大量的內存得不到回收。
目前,大部分瀏覽器都不采用這種方式,除了IE。IE中有一部分對象并不是原生的javascript對象,例如DOM和BOM中的對象是使用C++以COM(Component Object Model,組件對象模型)對象的形式實現的。
管理內存
Javascript為了安全性以及防止運行javascript的網頁耗盡全部系統內存而導致系統崩潰,分配給Web瀏覽器的可用內存數量通常比分配給桌面應用程序的少,但是這種內存限制問題不僅會影響給變量分配內存,同時還會影響調用棧以及在一個線程中能夠同時執行的語句數量。
因此,確保占用最少的內存可以讓頁面獲得更好的性能。優化內存占用的最佳方式,就是為執行中的代碼只保存必要的數據,一旦數據不再使用,通過將其值設置為null釋放其引用,這種做法叫做解除引用,這一做法適合大多數全局變量和全局變量的屬性,局部變量會在他們離開執行環境時自動被解除引用。
轉載于:https://www.cnblogs.com/onlycare/p/9791873.html
總結
- 上一篇: React-Router ---with
- 下一篇: 浅谈 “ 站内信 ” 的实现