c# – 如何使用IDisposable来修复内存泄漏

前端之家收集整理的这篇文章主要介绍了c# – 如何使用IDisposable来修复内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个.net应用程序似乎有内存泄漏问题. .net服务开始大约100MB的内存,但在负载下它大约400-500MB.我的大多数类没有非托管资源,而且已经实现了IDisposable.所以我的问题是在我的课程帮助上打字IDisposable?

4-500 MB本身并不关心.关注的是有8种不同的服务.每个都是使用SharpArch,NServiceBus,Windsor和NHibernate构建的.我的感觉是,其中一个中的某些东西导致了问题.我担心的是,所有服务的总内存大约是3.2到3.6 GB的内存.它还没有抛出OutOfMemory异常,但是我想在传球时把它关掉.我也使用了dotTrace,它给了我一些信息,我只是不确定如何对这些信息采取行动

解决方法

我首先关心的是确保你测量相关的东西. “记忆”可能意味着很多不同的东西.耗尽虚拟内存空间和耗尽RAM之间存在巨大差异.由于破坏页面文件导致的性能问题与因创建过多GC压力而导致的性能问题之间存在巨大差异.

如果您不理解RAM,虚拟内存,工作集和页面文件之间的关系,那么首先要做一些阅读,直到您了解所有这些内容为止.你提出这个问题的方式让我怀疑你相信虚拟内存和RAM是一回事.他们当然不是.

我怀疑你正在做的算术是:

>我有八个进程,每个进程消耗5亿字节的虚拟地址空间
>我有40亿字节的RAM
>因此我即将获得OutOfMemory异常

这个三段论完全无效.这是三段论:

>我有八夸脱的冰淇淋
>我在冰箱里有九夸脱的冰淇淋
>因此,如果我得到两夸脱的冰淇淋,有些东西会融化

事实上,你隔壁有一个整个仓库大小的冷藏设施.请记住,RAM只是一种方便快捷的方式,可以将物品存放在您需要的地方附近,比如冰箱.如果你有更多的东西需要存储,谁在乎你是否在本地用完房间?您可以随时弹出隔壁并将您使用的东西放在长期深度冻结中 – 页面文件.那不太方便,但什么都没有融化.

当进程耗尽虚拟地址空间时,而不是当系统中的所有RAM都被消耗时,会出现“内存不足”异常.当系统中的所有RAM都被消耗时,您不会收到错误,因此操作系统会花费所有时间从磁盘来回运行内容.

因此,无论如何,首先要了解您正在测量的内容以及Windows中的内存如何工作.你应该寻找的是:

>在32位系统上是否存在使用超过20亿字节虚拟内存的任何进程?一个进程只获得2GB的虚拟内存(不是RAM,记住,虚拟内存与RAM无关:这就是为什么它在win32上被称为“虚拟” – 它不是硬件)可由用户代码查询;如果你试图使用更多,你会得到一个OOM.
>是否有任何进程存在尝试分配大量虚拟内存的危险,以至于没有该大小的连续块空闲?例如,您是否可能在一个阵列中分配一千万字节的数据?再次,OOM.
>工作集 – 即出于性能原因需要在RAM中的进程的虚拟内存页 – 是否所有进程都小于可用的RAM量?如果没有,那么很快你就会吵架,但不是OOM.
>如果RAM开始变短,你的页面文件是否足以处理可以被分页到磁盘的虚拟内存页面

到目前为止,这与.NET没有任何关系.一旦你确实确定存在真正的问题 – 可能没有 – 然后根据真正的问题开始调查.使用内存分析器检查内存分配器和垃圾收集器正在执行的操作.查看大对象堆中是否存在大块,或者是否存在无法收集的活动对象的意外大图,或者是什么.但要运用良好的工程原理:了解系统,使用工具调查实际的经验性能,试验变化并仔细测量其结果.不要只是开始在几个类上随机拍打魔术IDisposable接口,并希望这样做会导致问题 – 如果有的话 – 消失.

猜你在找的C#相关文章