淺談垃圾回收機制
C/C++經典垃圾回收算法
1. 引用計數法:
每個對象計算指向它的指針數量
當有一個指針指向自己時數值加1
當刪除一個指向自己的指針時計數減1
如果減為0,說明已經不存在指向該對象的指針了,所以可以安全銷毀了。
2. 標記-清除算法
3. 標記-縮並算法
4. 節點拷貝算法
引用計數法能夠平滑的進行垃圾回收,而不出現“停止”現象,經常出現於一些實時系統中,但它無法解決環形問題。
後面三種統稱為跟蹤垃圾回收,在每一次垃圾回收過程中,要遍歷或者復制所有存活的對象,這是一個非常耗費時間和空間的工作。
一種好的解決方案就是對堆上的對象進行分區,對不同區域的對象使用不同的垃圾回收算法,分為年輕代(新生成的對象),老年代(經歷了N次回收仍然存活的對象),持久代(用於存放靜態文件,如Java類,方法等)
Lua的垃圾回收機制
1. 如何檢測lua的編程產生的內存泄漏
a. 針對產生泄露的函數,先調用collectgarbage("count"), 取得最初的內存使用
b. 函數調用後,collectgarbage("collcet")進行收集,並使用collectgarage("count")在取得當前內存,最後記錄兩次的使用差。
c. 需要多次調用。
2. 如何避免lua應用中出現的內存使用過大的行為
a. 代碼實現不出現泄露
b. 在測試中,其實還發現,Lua被分配的內存,其實並不會自動回收,所以,為了避免內存過大,應用運行時,可以需要定期調用collectgarbage("collcet")進行顯示回收
JS的垃圾回收機制
JS具有自動的垃圾回收機制,垃圾回收器會按照固定的時間間隔周期性的執行。
最常用的垃圾回收方式就是標記清除
什麽情況會引起內存泄漏:
1. 意外的全局變量引起的泄露
原因:全局變量,不會被回收
解決:使用嚴格模式
2. 閉包引起的內存泄露
原因:閉包可以維持函數內部局部變量,使其得不到釋放
解決:將事件處理函數定義在外部,解除閉包。
4. 被遺忘的定時器或者回調
原因:定時器中有dom的引用,即使刪除dom,定時器還在,所以內存中還是有dom
剞劂:手動刪除定時器和dom
5.子元素在引用時引起內存泄露
解決:手動刪除情況。
淺談垃圾回收機制