[英]Targetting memory leak in a .NET production service
我有一个在生产中运行的C#.NET服务。 该服务用作客户端注册和发出请求的TCP服务器。 在查看任务管理器时,它似乎泄漏了大约10MB /天。 我似乎没有注意到这些(也许是因为流量和客户活动少得多)。 在搜索时我已经读到任务管理器可能严重错误,但我不确定这是多么准确或在什么情况下TM会显示不正确的信息。
要解决这个问题,我需要更密切地监控内存消耗。 问题是泄漏似乎只出现在生产中,其中部署的服务是为Release构建的。 此外,因为它是一个无法直接运行的服务,带有附加的分析器/调试,我不知道如何用比TM更精确的东西来最好地查明问题。
任何群体智慧都会非常感激,谢谢。
编辑:
如果我的私有字节变得很大但CLR内存大致是静态的,这将表明一个非托管泄漏。 如果两者都变得巨大,那么它就是一个有管理的泄漏。
多谢你们。
您的第一个任务是确定进程是否泄漏内存。 您可以使用perfmon测量私有字节http://www.goldstarsoftware.com/papers/CapturingVirtualBytesToALogFile.pdf
如果图表一直在上升(例如半小时),则会出现内存泄漏。 然后,您可以使用其他计数器来确定这是否是.NET泄漏(.NET内存),尽管这不太可能。 我发现在大多数情况下,有一个COM组件正在被调用但未被释放。
如果你确实有内存泄漏(这不仅仅是可变内存使用) - 运行一段时间后,进程将因内存不足而关闭。
您需要以下MemoryProfilers之一来监控它;
http://www.jetbrains.com/profiler/
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/
还有其他选择,但这些选项非常强大,您可以使用它们分析远程应用程序的内存(至少JetBrains的解决方案处理它)
请遵循以下指南: http : //blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx
它完全超出了你所描述的内容,即生产中的内存泄漏。 如前所述,您必须首先确定它是使用perfmon和Private Bytes泄漏的非托管代码还是托管代码。
一般来说,确保使用语句包装它们的网络对象,以便正确处理它们。
我经常用于托管内存泄漏的工作流程是在测试计算机上启动服务器,使用已知数量的连接(例如123,456个连接)命中它。 然后通过转到任务管理器并右键单击进程名称并选择“create dump”来获取内存快照。 使用WinDBG和SOS打开此转储并运行命令!dumpheap -stat。 查找具有123,456个实例的多个对象。 这些物体是否仍然在记忆中? 如果没有在这些对象的实例上运行!gcroot来查找它仍然在内存中的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.