.NET Memeroy Profile 优化C#程序实战笔记

来源:互联网 发布:qq数据库在线查询网站 编辑:程序博客网 时间:2024/05/03 08:25
.NET Memeroy Profile 优化C#程序实战笔记
   对于应用程序来讲,优化的度比较低,但是对于网页插件并且可以不断的重复构造时,内存就会造成大量的堆积,优化是必须的。我实战优化我们的程序时,记录了整个过程。
一、实战前的准备工作
       1) 建议关掉timer之类的,容易引起内存波动,不好测试等。
          2)编写测试用了,没有什么好的版本,只能使用删减控件,让控件逐步的增加或者减少,排除法看效果。
          3)编写可以重复的场景的测试用例程序。
二、实战过程
1)由于开启了拖拽引起的GCHandle引用导致,自己无法释放自己
      
         如图,执行了100次,居然PhotoListView执行了释放,但是居然没有GC回收,查看为什么?
         

     DropTarget由于可能采用了非托管的指针,

     导致 GCHhandle原来PhotoListView由于开启了AlowDrop功能没有被释放。

    不过呢,GCHandle就没有被其他引用了,可以不关心这个问题 。

      这个最后只是占用多个程序句柄而已。可以不关心。 详细参考GCHANLDE 的资料。


2)由于代码之间存在应用,而一些代码又是必须显示调用Dispose的。
     也就是A包含B,B必须显示调用Dispose的,否则无法自动释放的原因,A也无法释放,造成的整体引用无法释放。
      引用计数器无法为0,GC也就无法释放了。

实战1:执行10次,开启PhotoListView的子对象CaheManager里面的后台线程。
     

 结果,我们发现,也是导致自己不能释放自己,但是起码是被显示释放了,不过GC没有处理好这些问题而已,可以事不关己高高挂起。
   如果B自己包含对象没有被Dispose会怎么样?


 没有什么改变。

实战3:如果主程序的MainControl通过事件绑定了A包含的B组件,并且直接访问关联了,那么就很难释放了,外部只能现关联释放。
    
可以直接分析出原因所在!!!
            this.ListThumb.ItemDoubleClick += new ItemDoubleClickEventHandler(ListThumb_ItemDoubleClick);
           
自己手动添加的只能自己拔掉最好,否则无法释放啊,准确是有效释放。


手动释放组件:
代码如下:
 protected override void Dispose(bool disposing)
        {
            this.ListThumb.KeyDown -= new KeyEventHandler(ListThumb_KeyDown); 
        .....
}

结果上面的关系立即消失了,问题得到解决!!!

实战4:如果PhotoListView包含图标,根本没有释放的话会怎么样?其实没有事情的,只要不被外部关联的话,C#可以被释放的。
            因为PhotoListView包含它,如果主人都不再了,它又没有被其他外部应用,就没有问题。
           这个关键就是“它又没有被其他外部应用,",这个才是关键,解决问题的关键还是解耦的问题,还有代码的问题,当然需要细心才行。
           
     


实战五:通过外挂事件的控制器组件,由于自己绑定了事件,没有卸载组件造成的问题,导致无法铲除相关联的组件。
     

实战六:是否要实现Dispose和析构方法
    .NET的内存回收还是不错的,但是如果自己写似乎并行的时候,回收的特别快和及时,可能来源于我本人是从原生程序出身吧,释放内存是手动完成更加靠谱的感觉,怀疑GC的能力。
    实际上还行吧,但是有些需要手动回收,否则会出现回收效率的问题,但是最终还是能够回收的“个人感觉吧”,水平有限,就这样了。

图标标识出来被铲掉,结果还在铲.....可不好,呵呵。很形象的。

实战七:优化的顺序,应该从小铲子的开始。而且工具提出了耦合的依赖,只要把依赖挂掉就行了。

如图:怎么优化呢,直接将工具紫色的关连线切断就行了。


0 0