首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何探索.NET应用程序中的托管堆以确定可能的内存优化?

如何探索.NET应用程序中的托管堆以确定可能的内存优化?
EN

Stack Overflow用户
提问于 2010-06-02 19:15:21
回答 5查看 7K关注 0票数 10

我们有一个.NET应用程序,我们的客户认为它太大了,不适合大规模部署,我们想了解是什么造成了我们的内存占用,以及在不完全放弃.NET和wpf的情况下是否有可能做得更好。

我们对改进Total Size和Private We (pws)感兴趣。在这个问题中,我只想看看pws。VMMap通常报告pws为105mb。其中11mb是镜像,31mb是堆,52Mb是托管堆,7Mb是私有数据,其余是堆栈、页表等。

这里最大的奖品是托管堆。我们可以直接在我们自己的代码中说明大约8mb的管理堆,即我们创建和管理的对象和窗口。其余的可能是由我们使用的框架的元素创建的.NET对象。

我们想要做的是确定框架的哪些元素占了这种用法的哪一部分,并潜在地重新构建我们的系统,以避免在可能的情况下使用它们。有人能建议如何完成这项调查吗?

进一步澄清:

到目前为止,我已经使用了许多工具,包括优秀的ANTS分析器和带有SOS的WinDbg,它们确实允许我查看托管堆中的对象,但这里真正感兴趣的不是“什么?”,而是“为什么?”理想情况下,我会说,“好吧,这里创建了10mb的对象,因为我们使用WCF。如果我们编写自己的本地传输,我们可以节省8mb的空间,同时承担x质量风险和y开发工作。”

在300,000+对象上执行gcroot是不可能的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-02 19:44:46

WinDbg对您来说可能是一个有用的工具。它是随Debugging Tools for Windows一起提供的。

一旦您的应用程序开始运行,您就可以附加WinDbg并探索托管堆。(或者,您可以进行内存转储并脱机探索它)。它将能够非常快速地告诉您消耗最多内存的对象类型。

首先,您需要加载SOS扩展,该扩展支持对托管应用程序进行调试:

代码语言:javascript
复制
.loadby sos mscorwks

然后,您可以使用!dumpheap来获取堆信息,-stat开关给出了有关分配的类型的总体堆信息:

代码语言:javascript
复制
!dumpheap -stat

-type参数提供有关指定类型的已分配实例的特定信息:

代码语言:javascript
复制
!dumpheap -type System.String

还有一堆其他命令可能会对您有所帮助,例如:

  • !gcroot -为了跟踪一个已分配的对象,备份它的根目录,找出它为什么在memory.
  • !dumpobj中-转储一个特定的对象,这样你就可以看到它的contents.
  • !EEHeap -给出一些通用的堆统计信息。

MSDN有一个full list of SOS commands和它们的交换机。

WinDbg是一个相当复杂的工具,但如果你通过搜索来帮助你入门,网上有很多教程和指南。或者,我可以推荐John Robbins的书Debugging Microsoft .NET 2.0 Applications,该书对WinDbg和SOS的.net调试能力进行了一些很好的详细介绍。

您可以将SOS扩展加载到visual studio中,方法是在即时窗口中输入以下内容,然后您就可以直接在VS即时窗口中使用SOS命令:

代码语言:javascript
复制
.load SOS.dll

您可能还会发现CLR Profiler和这个Usage guide很有帮助。

票数 12
EN

Stack Overflow用户

发布于 2014-09-17 13:00:26

新的工具是PerfView,它可以显示引用树,还可以进行差异化

票数 3
EN

Stack Overflow用户

发布于 2010-06-02 20:04:14

CLR探查器还以图形方式显示堆中按类型分配的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2957105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档