【问题标题】:.NET Memory Dump - How to report on non-managed memory?.NET 内存转储 - 如何报告非托管内存?
【发布时间】:2015-06-02 07:55:56
【问题描述】:

我们有一个托管在 Windows Azure 中的 ASP.NET MVC 网站。

RAM 飙升至约 3GB,因此我使用 Azure 诊断即服务 (DaaS) 工具进行了内存转储。

在使用 Visual Studio 调试托管内存时,我发现我的托管代码只占用了这 3GB 中的 500MB,还有 2.5GB 的内存下落不明。

这是 DaaS 内存分析报告的截图:

以及证明文件大小的转储文件:

如果 w3wp 中的代码不是我的托管代码,我该如何查看它正在占用我的 RAM?

编辑

来自调试诊断工具的虚拟内存信息:

【问题讨论】:

  • 也许您有托管资源,但未释放非托管资源。关于如何使用 WinDBG 有很多很棒的教程。
  • @YuvalItzchakov - 您的评论似乎无助于回答问题或帮助 try 并回答它。也许您可以通过一些链接和代码示例创建一个答案,并解释为什么您认为这是托管资源没有释放非托管资源的问题。
  • @Pure.Krome 这个问题太宽泛了,有很多可能的解决方案。解释如何工作 WinDBG 或为什么我假设可能是一个可能的托管资源持有非托管资源将仅仅基于理论将浪费时间并且过于笼统。相信我,我可以帮助 OP,我会的。鉴于这个问题中给出的细节很少,这是不可能的。
  • 我刚刚发现您的答案基本上是这样的:“Go google for WinDBG.GLHFTHXBBQ”。相反,我希望你可以这样说:“好的 - 棘手的问题。相当广泛。让我们试着锁定它一点。试试这个(链接)和这个(另一个链接)看看它是否可以做托管不释放非托管...”。我并不讨厌 - 只是想看看如何解决这个问题......我也多次遇到这个严重的问题,这很令人担忧。
  • 不要忘记考虑操作系统使用的 RAM 或您在同一虚拟主机计划上运行的其他网站消耗的 RAM。

标签: .net azure-web-app-service memory-dump


【解决方案1】:

正如我所见,您已经将内存转储下载到您的计算机上,您可以下载最新版本的调试诊断工具,并对转储文件运行托管内存分析和“本机内存分析”。这将提供有关本机内存分配位置的一些信息,尤其是本机堆或虚拟分配。如果您共享指向该报告的链接或共享该报告中的信息,我们也许能够确定使用本机内存的位置。我不确定 DAAS 中生成的默认报告是否包含该信息。

报告确实包含有关检测到的某些问题(如动态程序集等)的信息,因此您是否在报告顶部看到任何将已知问题称为错误、警告或信息的内容?

【讨论】:

  • 感谢您的回答。 DebugDiag 生成的报告与 DaaS 的报告相同。报告顶部没有任何内容(警告等)显示任何有用的信息。如何使用 Debug Diag 对转储文件运行“本机内存分析”?
  • 我从报告中看不到的是 3GB 加起来的地方。我可以看到大约 500MB 的 GC 堆使用量,但我在其他任何地方都看不到我占的其他 2.5GB。
  • 添加了有关虚拟内存/本机堆的信息 - 这有帮助吗?
  • 所以报告显示提交的内存是由于纯 VirtualAlloc 调用而不是由于 NT 堆。现在解决这类问题有点棘手,我们使用 LEAKTRACK.DLL(用于本地内存泄漏检测的 debugdiag 组件)在 webapps 环境中无法完成的事情。您是否能够通过运行压力测试来重现本地环境中的泄漏?如果是,则可以使用blogs.msdn.com/b/tess/archive/2010/01/14/… 中提到的步骤来解决此问题。
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2011-02-20
  • 2013-03-14
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多