wpf绑定treeview 带查找_如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/

从事大型企业项目的任何人都知道内存泄漏就像是大型酒店中的老鼠。当它们很少时,您可能不会注意到,但是您必须始终保持警惕,以防它们过多,闯入厨房并制造混乱。

查找,修复和学习避免内存泄漏是一项重要技能。

我将列出我和高级.NET开发人员为我提供建议的8种最佳实践技术,这些技术将教您检测应用程序中何时存在内存泄漏问题,查找特定的内存泄漏并进行修复。最后,我将介绍监视和报告已部署程序的内存泄漏的策略。

定义.NET中的内存泄漏

在垃圾收集环境中,术语“内存泄漏”有点违反直觉。当有垃圾收集器(GC)负责收集所有内容时,我的内存为何还会泄漏?

有两个相关的核心原因。第一个核心原因是当您具有仍被引用但实际上未使用的对象时。由于已引用它们,垃圾收集器将不会收集它们,并且它们将永久保留,占用内存。例如,当您注册事件但从不注销时,可能会发生这种情况。

第二个原因是当您以某种方式分配非托管内存(没有垃圾回收)并且不释放它时。这并不难做到。.NET本身有很多分配非托管内存的类。几乎所有涉及流,图形,文件系统或网络调用的操作都是在后台进行的。通常,这些类实现** Dispose **方法,该方法释放内存(稍后再讨论)。您可以使用特殊的.NET类(如Marshal)或PInvoke(有一个进一步的示例)轻松地自己分配非托管内存。

让我们进入我的最佳实践技术列表:

1.使用诊断工具窗口检测内存泄漏问题

如果您去调试 | Windows | 显示诊断工具,您将看到此窗口。如果您像我一样,则可能在安装Visual Studio之后看到了此工具窗口,立即关闭了它,再也没有想到它。诊断工具窗口可能会非常有用。它可以轻松地帮助您检测两个问题:内存泄漏和GC压力。

当您有内存泄漏时,“进程内存”图如下所示:

ef5d81b6994ee719acf9375522a69f22.png

图片

从顶部的黄线可以看到GC正在尝试释放内存,但它仍在不断上升。

当您具有GC Pressure时,过程内存图如下所示:

29aab77bd3fadb11395796f20991f890.png

图片

“ GC压力”是在创建新对象并将它们处置得太快而导致垃圾收集器无法跟上时。如图所示,内存已接近极限,GC突发非常频繁。

您将无法通过这种方式找到特定的内存泄漏,但是您可以检测到内存泄漏问题,这本身就很有用。在Enterprise Visual Studio中,“诊断”窗口还包括一个内置的内存探查器,该探查器确实可以查找特定的泄漏。我们将在最佳实践#3中讨论内存分析。

2.使用任务管理器,Process Explorer或PerfMon检测内存泄漏问题

检测主要内存泄漏问题的第二种最简单方法是使用任务管理器或Process Explorer(来自SysInternals)。这些工具可以显示您的进程使用的内存量。如果它随着时间不断增加,则可能是内存泄漏。

4f1fb8709e4417a8d11ff5f726619f1b.png

图片

性能监视器是有点难以利用[1],但能证明你的内存使用量随时间的一个很好的曲线图。这是我的应用程序的图形,它不停地

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值