你的位置:首页 > ASP.net教程

[ASP.net教程]C# 内存管理优化畅想(三)


1. 允许对象“嵌入式”组合:说白了,就是允许一个对象包含其他对象(包含的是对象本身,而非其引用),这样就把多个对象合并成了一个对象,减少了对象的数量,自然GC的压力就轻了。被包含的对象其实就相当于一个结构体(struct),禁止持有其引用。如果被包含对象是数组,至少应允许固定长度的情况,至于是否允许变长,则要看实现的难易程度了。

相关英文贴:

https://github.com/dotnet/roslyn/issues/2097

https://github.com/dotnet/roslyn/issues/6055

 

2. 把弱引用“升级”为语言特性,而不是作为一个类(为了兼容,原来的弱引用类也要保留)。目前的弱引用实现是CLR内部维护了长短两个弱引用表来记录弱引用,这样做似乎没有必要,而且引入了额外的开销,令使用者有所顾虑。既然GC之后CLR能够正确地更新本轮没被回收的对象的(强)引用,那么按理说也能更新本轮已被回收的对象的弱引用,并不需要额外的弱引用表,至少短弱引用是这样。如果能打消使用者的顾虑,使他们更近大胆地使用弱引用记录缓存,使用得当的话也是能给减轻GC的压力的。

相关英文贴:

https://github.com/dotnet/roslyn/issues/2171

 

结语:到此为止,我所能想到的内存优化方法已经全部写完了,如果读者有更好的办法或者认为我的办法有缺陷,欢迎在评论中指出。这篇文章之所以写得这么晚,主要是因为花了不少时间考虑引用计数的问题,本打算再写一篇关于用引用计数来辅助GC的文章,但思考后发现这样做其实有得有失,未必能提高多少效率,比如会造成内存碎片并降低分配新对象的速度。而且引入引用计数之后,整个内存管理将变得非常复杂,可能得不偿失,故最终放弃。其实即使没有引用计数,只要我在本系列文章中提出的其他优化方案能够全部或部分实现,就已经能大大提高GC效率了。