我有一本书.NET服务,普通的专用工作集约为80MB.在最近的一次负载测试中,进程的内存使用率达到了3.5 GB,导致整个机器的物理内存不足(使用了4 GB中的3.9 GB),并且在负载测试停止后很长时间内存没有释放.使用任务管理器,我获取了一个进程的转储文件,并在VisualStudio2010SP1中打开了它,我可以开始对它进行调试.

如何诊断内存问题?我有点记忆力.x在我看来,它支持转储文件的内存分析吗?如果没有,VisualStudio2010 Premium的内存分析功能会有帮助吗(我目前有专业版)?WinDbg能帮上忙吗?

UPDATE:新的Visual Studio 2013 Ultimate现在可以使用转储文件本机诊断内存问题.更多细节见this blog post.

推荐答案

安装WinDbg.您需要确保获得正确的x86或x64版本,具体取决于您的转储.这里是指向x86的download的直接链接.

On that, you need to ensure you took the correct dump. You can use Task Manager to create the dump file (right click on process -> Create Dump File). If you're on 64bit and your process is x86 use the 32bit version of Task Manager (C:\Windows\SysWOW64\taskmgr.exe) to take the dump file. See my article for more info on taking dump files, eg if you're on XP and need to use windbg to create the dump file.

warning有一个相当陡峭的学习曲线,事情可能不会完全按照这里描述的那样进行,所以请带着任何问题回来.

假设您使用的是.NET4,因为您可以在Visual Studio中打开转储文件.以下是帮助您使用DMP文件的very个快速指南:

1) Run WinDbg, set symbols path (File -> Symbol Search Path) to

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

2)打开崩溃转储或将.DMP文件拖到WinDbg上.

3) 在命令窗口中键入该命令

.loadby sos clr

(仅供参考,对于.NET 2,命令应为.loadby sos mscorwks)

4) 然后打这个

!dumpheap -stat

其中列出了对象的类型及其计数.

在此处输入图像描述

您必须在应用程序的上下文中分析这一点,并查看是否出现异常.

windbg还有much个,谷歌是你的朋友.

.net相关问答推荐

.NET 7.0中的UseHttpsRedirection和IIS生产部署

无法通过构建目标访问 dotnet 的环境变量

F#:跨度、提升和底部类型(或缺乏)

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

RNGCryptoServiceProvider 的优缺点

如何以编程方式 Select ListView 中的项目?

HttpClient 和使用代理 - 不断得到 407

什么是编组?当某些东西被编组时会发生什么?

静态析构函数

在 C# 中使用委托

双倍的? = 双倍? + 双倍?

如何制作通用类型转换函数

.NET 中的对象引用有多大?

通过反射查找可空属性的类型

如何将 Excel 序列日期编号转换为 .NET DateTime?

IronPython 与 Python .NET

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

WPF中的依赖属性和附加属性有什么区别?

LINQ 可以与 IEnumerable 一起使用吗?

在 try/catch/finally 中等待的一个很好的解决方案?