最近写socket时填了个坑,服务端在接收数据后占用内存几乎同比增大。接收数据的对象用Dictionary将收到的数据包都存了起来。很简单嘛,存好后将对象解引用内存就回收了。于是解引用,内存未释放。于是将字典清空,解引用,内存未释放,摊手(才不止这点attempts, mmp)。点开vs->分析->性能探查器,分析内存占用,确实是字典占用了内存。后来终于发现自己忽略了对象有一个回调,该回调用于在存数后发起通知,把回调置空后GC终于干活了。之前还专门记录过,再在这儿贴出来:引用了实例方法的委托也就引用了一个特定的对象,当通过该委托调用这个实例方法时,该对象在调用中成为 this。https://www.cnblogs.com/xuanhu/p/10591382.html。
可以做一个有趣的尝试:Form1有个委托,两个按钮;Form2有个函数,该函数只做一件事儿,ShowMessageBox;Fomr1按钮1单击事件实例化一个Form2,并将Form2的函数添加到Form1委托的调用列表中,然后Form2.Dispose,再调用委托。Form1按钮2单击事件搞个for循环,按钮1.PerformClick。运行点击Form1的按钮2看看结果,印象应该比较深刻。