C#-c# 项目中,采用何种方法或者工具,检测内存泄露

C#-c# 项目中,采用何种方法或者工具,检测内存泄露

浮生未歇 发布于 2017-10-13 字数 0 浏览 1794 回复 3

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

灵芸 2017-10-24 3 楼

收费的工具推荐2个,
1) redgate 的memory profiler,这个比较经常用
2) dotTrac,这个早期貌似有内存检测工具,但是我用的版本是没有的,同事有提及过,可以搜索下

或者可以考虑找找有没有破解版

清晨说ぺ晚安 2017-10-23 2 楼

托管堆的内存分配(下文中的托管堆指的是GC堆)

托管堆是以应用程序域为依托的,即每一个应用程序域有一个托管堆,每一个托管堆也只属于一个应用程序域,且托管堆是一块连续的内存,其中的对象也是紧密排列的。相对于C++中的非连续内存堆来说,托管堆的内存分配效率要高。托管堆维护了一个指针,指向当前已使用内存的末尾,当需要分配内存的时候,只需要指针向后移动指定数量的位置即可。而且托管堆通过应用程序域实现了应用程序之间内存的隔离,即不同的应用程序域之间在正常情况下是不能相互访问各自的托管堆的。

垃圾收集

垃圾收集的算法有很多。例如引用计数、标记清除等等,托管堆使用的标记清除算法。

托管堆使用的是分代标记清除算法。

标记清除算法

首先,系统将托管堆内所有的对象视为可以回收的垃圾,然后系统从GCRoot开始遍历托管堆内所有的对象,将遍历到的对象标记为可达对象,在遍历完成之后,回收所有的非可达对象,完成一遍垃圾收集。

注意,托管堆的垃圾收集只会自己收集托管对象!

由于在执行完垃圾收集之后,托管堆中会产生很多的内存碎片,导致内存不再连续,因此在垃圾收集完成之后,系统会执行一次内存压缩,将不连续的内存重新排列整齐,变成连续的内存。(关于垃圾收集的详细信息,大家可以参考《CLR Via C#》)

通过上面的简述,大家都知道什么样的对象不会被收集,即能从GCRoot开始遍历到的对象。

最常见的GCRoot是线程的栈,线程的栈里面通常包含方法的参数、临时变量等。另外常见的GCRoot还有静态字段、CPU寄存器以及LOH堆上的大的集合。因此,如果想要让托管对象的内存顺利的释放,只需要断开与跟之间的联系即可。而对于非托管对象的内存,必须进行手动释放。

归属感 2017-10-15 1 楼

可以考虑通过性能测试工具,LR、WAT等工具对系统进行性能测试,可以监视系统的内存和CPU使用情况。

工具有:
Purify内存扫描工具,是一个很好的内存泄露检查工具,可以进行黑盒和白盒测试。
参考:http://www.ltesting.net/ceshi/ceshijishu/rjcsgj/rational/purify/2007/0505/1269.html
参考这个,这里有介绍检测内存泄露的方法
http://www.ibm.com/developerworks/cn/web/1106_hujj_browsertest1/index.html