簡介:
垃圾回收(GC)是指將廢棄的內存重新回收再次使用的過程。是內存管理的一部分。
原理:
Unity采用的是BOEHM GC, BOEHM GC使用的是Mark-Sweep,也就是先通過一個Root指針來遍歷所有的被引用的對象,並標記。直到遍歷完所有的指針。再次遍歷整個,將未標記的內存釋放。
機制說明:
(1)unity內部會有兩個內存管理池:堆內存和堆棧內存。堆棧內存(stack)主要用來存儲較小的和短暫的數據,堆內存(heap)主要用來存儲較大的和存儲時間較長的數據。 (2)unity中的變量只會在堆棧或者堆內存上進行內存分配 (3)只要變量處於激活狀態,則其占用的內存會被標記為使用狀態,則該部分的內存處於被分配的狀態 (4)一旦變量不再激活,則其所占用的內存不再需要,該部分內存可以被回收到內存池中再次被使用,這樣的操作就是內存回收。處於堆棧上的內存回收速度極其快速,處於堆上的內存並不是及時回收的,因此其對應的內存依然會被標記為使用狀態。 (5)垃圾回收主要是指堆上的內存分配和回收,unity中會定時堆堆內存進行GC操作
何時會觸發垃圾回收:
主要有三個操作會觸發垃圾回收:
1) 在堆內存上進行內存分配操作而內存不夠的時候都會觸發垃圾回收來利用閑置的內存;
2) GC會自動的觸發,不同平台運行頻率不一樣;
3) GC可以被強制執行。
垃圾回收的操作:
1.檢測堆內存的存儲變量
2.查看變量是否激活
3.標記無激活的變量為可回收
4.被標記變量移除回收
優化手段:
1.對象池
2.清除鏈表
3.主動調用System.GC.Collect()
4.檢測不必要的堆內存代碼:如字符串,LINQ和常量表達式,協程,結構體代替class
5.緩存