返回首页

。最佳实践5: - 检测NET应用程序的内存泄漏。{A}提高垃圾收集器的性能,使用敲定/处置模式



。NET应用程序中的内存泄漏一直是程序员的噩梦。内存泄漏是最大的问题,当涉及到生产服务器。服务器通常需要运行,停机时间最少。生长缓慢的内存泄漏后的某个时候,他们带来了服务器所消耗的内存大块。最大的时间重新启动系统,使其工作暂时发送遗憾注意客户的停机时间。

请随时免费下载我的自由500的问题和答案电子书涵盖。NET,ASP.NET,SQL Server的,WCF,WPF中,世界自然基金会@

首要的任务是,以确认有内存泄漏。许多开发人员使用Windows任务管理器来确认,有一个在应用程序的内存泄漏?使用任务管理器不仅是误导,但它也没有提供关于内存泄漏的大量信息。{S2}
首先,让我们试着去了解如何在任务管理器内存中的信息是误导。任务管理器显示工作集内存,而不是实际使用的内存,OK,是什么意思。此内存分配的内存,而不是使用的内存。进一步增加一些内存工作集可以由其他进程/应用程序共享。{S3}
这样大的金额比实际使用的内存工作集内存。
为了得到我们需要跟踪应用程序所消耗的专用字节的应用程序所消耗的内存适量。专用字节内存不被其他应用共享的地区。为了检测我们需要使用的应用程序的性能计数器所消耗的专用字节。
下面是我们需要遵循的步骤,以跟踪使用性能计数器的应用程序的专用字节: - 启动您的应用程序有内存泄漏,并保持它的运行。点击开始转到运行,键入"PerfMon的??选择计数器和删除通过点击"删除"按钮,删除当前所有的性能计数器。右击,选择"添加计数器??,选择"的过程吗?从性能对象?从计数器列表中,选择"专用字节?? 从实例列表中选择你想测试内存泄漏的应用程序。
如果你的应用程序在专用字节值,这意味着我们有一个内存泄漏问题,在这里显示了稳步增长。你可以看到如下图的私人字节的值是不断增加,从而确认该应用程序的内存泄漏。{S4}的

上图显示了一个线性的增加,但在现场实施,它可以需要几个小时才能显示上升趋势的迹象。为了检查内存泄漏,你需要到生产服务器上运行的性能计数器可能几个小时或天,一起检查,如果真的有一个内存泄漏。

一旦我们已经证实有一个内存泄漏,它的时间来调查的内存泄漏的根源问题。我们将鸿沟的解决方案,我们的旅程,在3个阶段是什么,如何及在何处。什么: - 我们将首先尝试进行调查是什么类型的内存泄漏,这是一个托管的内存泄漏或托管的内存泄漏。如何: - 什么是真正导致内存泄漏。它是连接对象,谁处理不封闭等某些类型的文件?地点: - 哪些功能/常规或逻辑是导致内存泄漏。{五}
之前,我们尝试了解泄漏的类型是什么,让我们尝试了解内存是如何分配的。Net应用程序。 NET应用程序有两种类型的内存管理内存和非托管内存。托管内存是由非托管内存垃圾收集垃圾收集边界之外。{中六}

所以我们需要确保的是什么类型的内存泄漏的第一件事是管理的泄漏或托管泄漏。为了检测,如果是我们需要测量两个性能计数器一个托管泄漏或托管泄漏。
第一个是我们已经看到在上届会议的应用程序的专用字节计数器。
第二个计数器,我们需要添加的是"在所有堆的字节??所以选择?NET CLR内存??性能对象,计数器列表中选择"在所有堆字节??和选择应用程序内存泄漏。 {七}
专用字节的应用程序所消耗的总内存。在所有堆的字节是由托管代码占用的内存。因此,方程变为如下图所示的东西。{S8}
联合国托管在所有有助于=,私人字节,如果我们要找出非托管内存中,我们总是可以减去私人所有字节堆的字节字节的内存。
现在,我们将两个语句: - 如果所有堆的专用字节数的增加和字节保持不变,这意味着它的非托管内存泄漏。如果在所有堆的字节线性增加,这意味着它是一个托管的内存泄漏。
下面是一个典型的非托管泄漏截图。你可以看到专用字节的增加而堆的字节保持不变{S9}
下面是一个典型的的托管泄漏拍摄的屏幕。在所有堆的字节增加。{S10}

现在,我们已经回答了什么类型的内存泄漏的时候看到如何是内存泄漏。换言之,谁是导致内存泄漏?
因此,让我们的调用"Marshal.AllocHGlobal注入非托管内存泄漏??功能。这个函数分配非托管内存和注入非托管应用程序中的内存泄漏。此命令是运行在定时器号次,造成巨大的非托管泄漏。

private void timerUnManaged_Tick(object sender, EventArgs e)

{

	Marshal.AllocHGlobal(7000);

}


这是非常困难的注入一个托管的泄漏GC确保回收的内存。为了使事情变得简单,我们通过创建很多刷对象,将它们添加到一个列表是一个类级别的变量模拟一个托管的内存泄漏。这是一个模拟,而不是一个管理泄漏。一旦应用程序关闭这个内存将被回收。{C}
如果你有兴趣知道如何泄漏可能发生在托管内存中,你可以参考更多的信息 NBSP弱处理程序;
下一步是下载"DebugDiag资料 NBSP工具??;
启动调试诊断工具,并选择"内存和句柄泄漏??,然后单击下一步。{S11}

选择要检测内存泄漏的过程中。{S12}

最后选择"激活规则现在??{S13}
现在,让我们的应用程序运行和"DebugDiag资料??工具将运行在后台监视内存的问题。{S14}

完成后点击开始分析,让分析的工具。

你应该得到一个详细的HTML报告,该报告显示非托管内存是如何分配。在我们的代码中,我们有巨大的非托管内存分配,使用"AllochGlobal??这是在下面的报告显示。类型说明 警告:3.59兆字节的优秀分配。 警告 :6.00字节优秀拨款。
托管内存泄漏的刷子使用"GDIPLUS.DLL??在下面的HTML报告。 类型说明 警告:399.54字节优秀拨款。
一旦你知道内存泄漏的根源,它的时间去找出其中的逻辑是导致内存泄漏。没有自动化工具造成内存泄漏检测逻辑。您需要手动在你的代码,并采取"DebugDiag资料提供指针??结束在哪个地方的问题。
例如,从报告中很明显,"AllocHGlobal??非托管的泄漏而造成的GDI对象之一是造成管理的泄漏。使用这些细节,我们需要向他们走在代码中看到的问题在于什么地方。
你可以下载源代码,从这篇文章的顶部,它可以帮助你注入内存泄漏。
这是我的不公平地说,上述文章完全是我的知识。感谢所有的可爱的人下来,谁写的文章,使一个像我这样的一天有人可以受益。{A18} 一个精彩的博客上调试器的可爱淑女苔丝。有一些伟大的内存泄漏检测实验室使用WinDbg,千万不要错过。苔丝上帝保佑你,你喜欢什么博客岩石。{A19} 这是一个伟大的文章詹姆斯科瓦奇在托管和非托管的内存泄漏,必须阅读。{A20} 使用WinDbg查找内存泄漏的大文章。{A21} : - 很大的联系,详细解释了工作集内存和专用字节之间的差异。 DebugDiag资料工具下载。{A23} - 大卫克莱恩解释在托管应用程序的内存泄漏的3个常见的原因。{A24}
NET的最佳实践1: - 在这篇文章中,我们讨论我们如何才能找到高内存消耗领域。NET。你可以阅读大约相同的{A25}
NET的最佳实践2: - 在这篇文章中,我们讨论了我们如何使用敲定/ Dispose模式可以提高性能。 {A26}
NET的最佳实践3: - 。NET应用程序中,我们如何使用性能计数器收集性能数据从{A27}
NET的最佳实践4: - 我们怎样才能提高带宽的性能,使用IIS压缩{A28}。| Shivprasad柯伊拉腊

回答

评论会员:游客 时间:2012/01/25
恩,不错的文章,但我只是想确认关于我的情况:NETCLR内存-所有堆字节有时会增加,也某个减少..工艺-专用字节有时也不断增加,也某个时候减少我的问题是:是否我的C#winform应用程序内存泄漏有人请告知提前许多感谢关于Winanjaya
肥大Avalons
评论会员:游客 时间:2012/01/25
。似乎并不像你有内存泄漏如果字节,然后不断增加它的一个问题,什么你已经保持在监视时间。NET面试问题我的书有500多问NET世界中的问题{A29}
。大教堂P
评论会员:游客 时间:2012/01/25
嗯.....我通常使用DDDD在类似案件。快捷方便。感谢:会员7928159
完整的记忆体交代。由于男子
评论会员:!Knight1219 时间:2012/01/25
上面的文章说,选择的应用程序,我们要监视的泄漏,从"Instancs"下拉。但我只找到两个数字0和1,在下拉列表中,所有的东西可以想象。请指教出现在那里做什么,使我的Java进程(这是使用JNI来调用C代码)
评论会员:ludwigs3rd 时间:2012/01/25
帮我找到我的应用程序泄漏
评论会员:。迈克尔贝克 时间:2012/01/25
你对此有什么想法?我一直在试图找出潜在的内存泄漏,在我的服务。我认为这是非常稳固,但要确保我在DebugDiag资料工具阅读,所以我创建了一个空的Windows服务(在技术上,我注释掉所有我的代码)。因此,所有的服务打开,没有线程,没有循环,没有什么。所以,我运行的分析工具,做一个转储后,我在下面贴的结果。我应该关心?如果没有,你能提供一些见解?谢谢!

警告:
NTDLL.DLL是14.75字节优秀拨款负责。以下是2内存消耗功能:
NTDLL RtlpAllocateUserBlock AE:10.95字节优秀拨款
。NTDLL RtlProcessFlsData B9:1.52字节优秀拨款

警告:
Mscoree.dll的是优秀的拨款为1.56字节值得。以下是2内存消耗功能:
!mscoree _calloc_impl C4:1.56字节优秀拨款
。警告:
高不成检测的症状在Leak_Rule_Targets__Date__09_21_2010__Time_12_28_10PM__Service.exe__PID__4456__620__Manual Dump.dmp
以下堆0x00300000(默认进程堆 - 零碎的98.63%​​)
0x008b0000(mscoreei! _crtheap - 93.75%分段)
0x00aa0000(MSVCR100_CLR0400! _crtheap - 99.91%分段)
"
评论会员:mburnie 时间:2012/01/25
感谢分享
评论会员:santoshpoojari 时间:2012/01/25
这是第一篇文章中,我遇到的内存泄漏的虚幻主题,这是既全面!
并在同一时间可以理解的。
保持良好的工作! {S16}
迈克尔贝克
michaelbakker1@gmail.com
评论会员:游客 时间:2012/01/25
Faddel:|好文章
mypaljohn
评论会员:好动确实 时间:2012/01/25
KunalChowdhury
评论会员:游客 时间:2012/01/25
本文是有用的,非常感谢你,!:|汤姆克莱门特
留言自动删除
评论会员:AshishKaila 时间:2012/01/25
花花公子,

mypaljohn写道:一个更大的用武之地印度混蛋....写愚蠢的文章。想知道如何可以在CodeProject禁止这些物品。

我们在这里分享我们的技术知识,向他人学习​​。我们痛恨这样的反馈。如果你不喜欢的任何物品(可能不会对您有用),不巴掌或侮辱。如果您有任何积极的反馈,做到这一点,你可以尽可能多。将不胜感激。
mypaljohn写道:讨厌印度人,他们到处都是

另外,不要尝试创建一个区域战争
不要忘了点击[投票]和[好答案]帮助你的职位。关于 - Kunal乔杜里|软件开发|金奈|印度| {A30}
评论会员:劳埃德阿特金森 时间:2012/01/25
哇,这家伙mypaljohn是这样一个混蛋。最糟糕的是最差的。请不要认为他所代表的任何人,但他自己biggoted的,愚蠢的,狭隘,和不道德的自我。
汤姆克莱门特
Serena软件公司
{A31}

{A32}
评论会员:劳埃德阿特金森 时间:2012/01/25
不要担心,他的帐户已封锁
Silverlight 5的教程: {A33}
评论会员:ScruffyDuck 时间:2012/01/25
大家都明白,你的大脑是太小掌握好知识。因此,作为一个光头,是你,我相信一个简单的借口。那么,你知道,如果你将是很好的,总有一天会聘请一些印度以及。直到这时好运的福利生活,由印度人
NBSP的税收支付;
Ashish Kaila
评论会员:gaurav_verma_mca 时间:2012/01/25
Kuch日志kabhi nahin sudharte
访问WCF,WPF世界自然基金会(WWF)的Silverlight,UML设计的格局@ http://www.questpond.com
我500视频
评论会员:Shivprasad柯伊拉腊 时间:2012/01/25
?跆拳道

根据您的位置,你在印度。