Unity GC

GC(Garbage Collection)就是让内存重新可被使用的过程。栈内存中的数据一旦超出作用域就会被立即释放不会引发GC,堆内存中的数据超出作用域不会被立即释放,只能通过GC进行释放。

首先当一个存放在堆中的变量被创建时,会经历以下步骤:
1:Unity首先检查堆中是否有足够的闲置内存,如果有则立即分配
2:如果没有足够的闲置内存,Unity就会触发GC释放掉一部分垃圾内存(过程可能很慢),如果释放后有了足够的闲置内存则进行分配
3:如果经过GC之后还没有足够的闲置内存,Unity就会拓展整个堆的内存(过程可能很慢)来进行分配

GC会在以下情况下触发:
1:堆内存中的闲置内存不够给当前新建的对象分配
2:GC会时不时的自动运行
3:GC可以被手动触发

每一次GC会经历以下过程,堆上的对象越多,对象的引用越多,意味着GC所做的工作越多
1:GC会检查堆上所有的对象
2:GC会检查所有这些对象的引用是否仍在作用域
3:每个不在作用域的对象都会被标记为待删除
4:GC删除每个待删除的垃圾对象

GC频繁的调用或者GC的时间过长不仅可能造成游戏的卡顿还会造成堆碎片(heap fragmentation)问题
堆碎片:因为堆内存可以被分配成小的可用内存块,所以可能当一些内存块被回收之后,虽然总的内存量很高,但是却没有大的内存块分配给大的数据对象。堆碎片问题会造成游戏运行使用的内存大于它实际需要内存的问题也会造成频繁的GC。

降低GC的影响可以从以下几个方面入手:
1:降低GC执行过程的时间
2:降低GC的执行频率
3:尝试在合适的时间(在对表现要求不高时比如加载界面时)手动调用GC与内存扩展,这是一个比较困难与不可靠的方法,不过在进行全局内存管理降低GC的影响时有一定的作用。

减少垃圾的产生可以从以下几个方面入手:
1:使用缓存
2:不要在被频繁调用的方法中分配内存
3:使用clear代替每次new一个集合
4:采用对象池技术

我们经常使用string,而string是引用类型所以也会产生不少垃圾,减少使用string带来的垃圾的途径如下:
1:该string字段如果使用不止一次就采用缓存将它缓存起来复用
2:减少对string的操作如拼接,因为string类型的字段自创建时起就是不变的,每次拼接都会分配一个新内存并且废弃一个旧内存(如Time:01:22倒计时,可以将“Time:”单独提取成Text,每次只改变时间)
3:如果必须要对string进行操作就使用StringBuilder(可理解成可变的string类型),在使用它操作字符串时不会新申请内存和废弃旧内存
4:当Debug.Log不用时应立即删除,因为它会至少生成或处理一个字符串

手动调用GC代码:System.GC.Collect();

你可能感兴趣的:(Unity)