这段时间看了一些针对GC的文章,感觉应该整理一下。首先分析一个课题需要明确该课题的意义,定义,结论。通过本文阅读,可以解答如下问题:
1 GC是什么?
2 GC是如何产生的?
3 GC给u3d应用带来了什么问题?
4 在u3d中如何定位这些GC问题?
5 如何在u3d中解决GC带来的问题
1 GC是什么?
GC是.net框架中用来自动管理内存的机制。针对u3d来说,通常使用C#来编写。C#中存在值类型与引用类型,值类型存储在栈上,引用类型存储在托管堆上,对于栈上面的数值,一般是生命周期较短数据较小的,所以栈内存的管理无需理会,mono会自动的解决。那么剩下堆内存的管理,这就用到了GC。堆内存上面一般存储数据大而且生命周期不确定的数据,应用程序使用过程中需要不断的在堆内存上分配空间供新变量使用,当空间不足时,GC会调用,首先会查找堆内存上哪些对象已经不被应用或者其他对象调用了,然后把这些对象标记下来,再删除这些对象,这样就有了新的空间来分配,这就是GC的原理。
2 为什么会出现GC呢?
当我们明白了GC的原理之后,这个问题变得简单了。
1)当应用分配空间时,如果空间不足就会出现GC。
2)系统自动调用GC,不同平台频率不同。
3)GC强制调用,手动调用。
3 Mono的GC会给我们带来什么问题呢?
1)GC的时间问题: 如果堆内存上变量/引用/对象太多,GC执行的时候需要去遍历所有对象,检查该对象是否被用,导致GC缓慢,性能低下,应用卡顿迟缓。
2)内存碎片化严重:如果堆内存上空间碎片化严重,各个变量对象之间存在间隙,会导致应用无法分配大块的空间供较大的变量使用,此时系统会让GC频繁执行,或者让堆空间不断重新分配,导致性能低下。其实对内存碎片化严重是由于GC不断的执行导致的,当GC执行的时候,清理掉变量空出来的空间不会进行重组合并,导致可用变量之间存在间隙空白,这些空白虽然组合起来够用,但是它不会组合。
4 如何在u3d中定位GC问题?
在profiler window中CPU usage栏中的GC alloc选项就代表了每一项GC清理的垃圾,可以定位到具体的函数。
5 如何解决GC带来的问题?
本篇文章先讲解策略,下篇文章继续讲解常见问题。
方向上来讲,
1 GC时间的降低,
2 GC调用频率的降低,
3 GC延迟时间降低
4 尽量少的产生垃圾
5 场景加载的时候或者没有玩家操作的时候,手动执行GC。
网友评论