闲鱼技术01 发表于 2022-3-27 19:39

using方法可能产生GC Alloc的原因总结 Unity

先说结论: List和字典的Enumerator是值类型,创建时就不会在堆上分配,而是由调用这个Dispose,要转换为IDisposable接口(由值类型对象转化为接口类型的对象)导致的;而用foreach遍历ArrayList产生GC Alloc的起因就不一样,因为ArrayList的Enumerator是引用类型,创建时自然会在堆上分配。

再说原因:
http://upload-images.jianshu.io/upload_images/27515542-ff99611d025dd7ed.png
从IL代码来看,在finally里调用了Dispose:
http://upload-images.jianshu.io/upload_images/27515542-d209ae4f7948e40f.png
using等价于try-finally,在finally里调用了Dispose,这也是foreach遍历List和字典产生GC Alloc的起因,由于List和字典的Enumerator是个值类型,为了调用这个Dispose,要转换为IDisposable接口(由值类型对象转化为接口类型的对象)会导致装箱操作。

另外,原生的C#代码是不需要手动调用Dispose方法清理的,GC会统一回收。至于foreach的实现原来为啥要那么写,应该也是生成GC Alloc这个bug的原因吧。

————————————————

版权声明:本文为CSDN博主「Real_JumpChen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/BillCYJ/article/details/81814355
页: [1]
查看完整版本: using方法可能产生GC Alloc的原因总结 Unity