1. 程式人生 > >淺談垃圾回收機制

淺談垃圾回收機制

並不會 調用 bag c++經典 跟蹤 行為 回收 過程 垃圾

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.子元素在引用時引起內存泄露

解決:手動刪除情況。

淺談垃圾回收機制