
這段時間看了一些針對GC的文章,感覺應該整理一下。首先分析一個課題需要明確該課題的意義,定義,結(jié)論。通過本文閱讀,可以解答如下問題:
1 GC是什么?
2 GC是如何產(chǎn)生的?
3 GC給u3d應用帶來了什么問題?
4 在u3d中如何定位這些GC問題?
5 如何在u3d中解決GC帶來的問題
1 GC是什么?
GC是.net框架中用來自動管理內(nèi)存的機制。針對u3d來說,通常使用C#來編寫。C#中存在值類型與引用類型,值類型存儲在棧上,引用類型存儲在托管堆上,對于棧上面的數(shù)值,一般是生命周期較短數(shù)據(jù)較小的,所以棧內(nèi)存的管理無需理會,mono會自動的解決。那么剩下堆內(nèi)存的管理,這就用到了GC。堆內(nèi)存上面一般存儲數(shù)據(jù)大而且生命周期不確定的數(shù)據(jù),應用程序使用過程中需要不斷的在堆內(nèi)存上分配空間供新變量使用,當空間不足時,GC會調(diào)用,首先會查找堆內(nèi)存上哪些對象已經(jīng)不被應用或者其他對象調(diào)用了,然后把這些對象標記下來,再刪除這些對象,這樣就有了新的空間來分配,這就是GC的原理。
2 為什么會出現(xiàn)GC呢?
當我們明白了GC的原理之后,這個問題變得簡單了。
1)當應用分配空間時,如果空間不足就會出現(xiàn)GC。
2)系統(tǒng)自動調(diào)用GC,不同平臺頻率不同。
3)GC強制調(diào)用,手動調(diào)用。
3 Mono的GC會給我們帶來什么問題呢?
1)GC的時間問題: 如果堆內(nèi)存上變量/引用/對象太多,GC執(zhí)行的時候需要去遍歷所有對象,檢查該對象是否被用,導致GC緩慢,性能低下,應用卡頓遲緩。
2)內(nèi)存碎片化嚴重:如果堆內(nèi)存上空間碎片化嚴重,各個變量對象之間存在間隙,會導致應用無法分配大塊的空間供較大的變量使用,此時系統(tǒng)會讓GC頻繁執(zhí)行,或者讓堆空間不斷重新分配,導致性能低下。其實對內(nèi)存碎片化嚴重是由于GC不斷的執(zhí)行導致的,當GC執(zhí)行的時候,清理掉變量空出來的空間不會進行重組合并,導致可用變量之間存在間隙空白,這些空白雖然組合起來夠用,但是它不會組合。
4 如何在u3d中定位GC問題?
在profiler window中CPU usage欄中的GC alloc選項就代表了每一項GC清理的垃圾,可以定位到具體的函數(shù)。
5 如何解決GC帶來的問題?
本篇文章先講解策略,下篇文章繼續(xù)講解常見問題。
方向上來講,
1 GC時間的降低,
2 GC調(diào)用頻率的降低,
3 GC延遲時間降低
4 盡量少的產(chǎn)生垃圾
5 場景加載的時候或者沒有玩家操作的時候,手動執(zhí)行GC。