65.9K
CodeProject 正在变化。 阅读更多。
Home

编写占用内存更少的应用程序

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 2 月 2 日

CPOL

4分钟阅读

viewsIcon

28035

理解应用程序如何使用内存是一个复杂且耗时的过程,但使用内存分析器可以在几分钟内完成相同的分析。ANTS Memory Profiler 是可视化 .NET 代码内存使用问题的简单方法。

为何要分析内存使用情况?

在 .NET 这样的托管环境中开发时,一个常见的误解是该环境将完全管理内存等资源的有效使用。尽管在托管环境中,开发者处理内存的任务大大简化了,但仍需高度关注以确保在不再需要时释放资源。例如,.NET 垃圾回收器会自动释放不再被其他对象引用的内存——但开发者仍然有责任确保在对象不再需要时销毁对它们的引用。如果引用未被正确移除,内存将永远不会被释放,应用程序将出现内存泄漏。

简单的解决方案

ANTS Memory Profiler 可以轻松地追踪这些问题——您可以在几分钟内开始分析应用程序的内存使用情况,无需阅读手册。运行 ANTS Memory Profiler 后,我们只需选择要检查的应用程序,然后点击“开始分析”,应用程序就会被加载。

Less-Memory/image001.png

图 1. 选择应用程序

我们可以分析 .NET 可执行文件、ASP.NET 和 Silverlight 4 应用程序、Windows 服务、COM+ 服务器和 XBAP 应用。ANTS Memory Profiler 还可以附加到正在运行的 .NET4 进程,实现零停机时间,并能够分析难以重现的应用程序状态。

我们通过拍摄快照然后分析其内容来分析内存使用情况。ANTS Memory Profiler 提供了 API,允许从代码内部自动拍摄快照,或者我们可以简单地按下“拍摄快照”按钮。快照会出现在交互式时间线上,并伴有持续更新的性能指标,从而可以快速可视化快照与应用程序事件的关系。

Less-Memory/image002.jpg

图 2. 交互式时间线

我们可以选择要分析的快照,还可以并排比较快照,以了解不同快照之间的内存使用变化情况。

Less-Memory/image003.png

图 3. 在不同的内存快照之间切换

那么内存的使用效率如何?

选择快照后,ANTS Memory Profiler 会立即生成一个摘要屏幕,显示最重要的信息。我们可以获得关于大对象堆碎片化的统计数据,以及快照之间总内存使用量的比较。我们还可以看到一个图表,显示不同 .NET 堆中存储的内存比例,这对于评估实例是否被持有时间过长特别有用。最后,我们还会看到一个关于最大类别的饼图。虽然某个类别占用大量内存可能有合理的原因,但在寻找内存问题时,最大的类别通常是很好的起点。

Less-Memory/image004.png

图 4. 摘要屏幕

ANTS Memory Profiler 的类列表显示了给定快照在内存中的所有类。一系列新的过滤选项使我们能够快速过滤噪音,找到可疑的类进行进一步分析,我们还可以通过按总大小或实例数量排序来查找最耗内存的类。

Less-Memory/image005.png

图 5. 类列表

缩小问题范围

找到可疑类后,我们可以使用新的实例分类器来检查该类实例为何被保留在内存中。实例分类器会自动将具有相同最短路径回到 GC Root 的实例分组。然后,我们可以快速浏览这些链,以了解是什么原因导致某些实例组保留在内存中。

Less-Memory/image006.png

图 6. 实例分类器

我们经常会发现由同一条回到 GC root 的链在内存中保留了数万甚至数十万个实例。实例分类器消除了检查每个实例以确定其是否导致问题的几乎不可能的任务。

在按内存保留原因对每个实例进行分类后,ANTS Memory Profiler 可以向我们显示每个实例的列表。然后,我们可以为其中任何一个实例生成一个实例保留图,以确定其被保留在内存中的确切原因。

Less-Memory/image007.png

图 7. 实例保留图

我们可以沿着引用的链向上浏览,查看该实例被引用的所有方式,并知道打破该链中的任何一个环节都可以使该块内存被释放。紧密关联的对象会被分组,以便更容易选择打破引用链的最合适位置。

接下来是什么?

ANTS Memory Profiler 是解决 .NET 代码中内存问题的最简单、最有效的方法。要了解它能多快帮助您改进自己的应用程序,请立即下载免费的 14 天试用版

© . All rights reserved.