。最佳实践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柯伊拉腊