c#服务中巨大的内存突发,可能是什么原因?

问题描述:

我正在处理一个c#服务应用程序,我有这个问题,没有地方,没有明显的原因,进程的内存将在大约5秒内从150mb爬到几乎2GB,然后返回到150MB。但是我们的系统里没有任何东西可以使用任何接近内存的地方(所以它可能是某个地方的错误)。它可能是一个紧密的,而真正的循环,但当时的CPU使用率非常低,所以我想我会寻找其他的想法。c#服务中巨大的内存突发,可能是什么原因?

现在,更奇怪的是,当我编译64位服务时,除了超过10gb的内存(大部分内存)外,还会发生同样的大量突发,并且只会导致计算机及其上运行的所有问题。一段时间后,它关闭,但它看起来像Windows仍然愿意给它更多的记忆。

你有什么想法或工具可以用来找到它吗? 是的,它有很多日志记录,但日志中没有任何内容突出显示为什么会发生这种情况。

我可以在控制台应用程序模式下运行该服务,因此我的下一个测试将在Visual Studio调试器中运行,并查看是否可以找到任何东西。

它只是偶尔发生,但通常在启动后大约10-20分钟。 在32位模式下,它会清理并继续照常进行。 64位模式在一段时间后崩溃并使用了大量的内存。 但我真的很难为什么会发生这种情况!

编辑:请参阅赞扬到WinDbg的发布

+0

您可以使用日志记录数据和内存使用率突发的时间在家什么代码在“突发时间”运行? – 2010-04-27 00:02:10

+0

是啊它看起来像正常的活动虽然:(如果我登录每一种方法,我可能会发现它,但这将有点臃肿> _ Daniel 2010-04-27 00:47:04

你做了很多分配的,那么你释放。你的记忆会增强,直到GC开始并在你之后开始清理。在amd64平台上,所有结构都比较大,因为与x86相比,指针,v表和其他结构本身尺寸是双倍的。

最简单的解决方案是在调试器下运行应用程序并等待凸起,然后将其冻结并转储。然后分析转储:

.loadby sos mscorwks 
!dumpheap -stat 

您的泄漏类型将位于列表顶部,并有大量分配。这与用于分析内存泄漏的技术是相同的,除了内存可能在技术上不泄漏,请参阅CLR Memory Leak

+0

我现在想这个了,我怎么让windbg不停止第一次机会例外,直到我说暂停时才运行? – Daniel 2010-04-27 00:46:09

+0

sxd 。例如'sxd av'或'sxd eh'或'sxd clr'。使用的异常类型将在停止时打印。 – 2010-04-27 00:56:14

+0

好的,它是目前2GB的内存,我已经停止了,跑了这些命令,这是我的问题: 000007fef9a4ec90 74179 1895994904 System.String System.Strings的 74179实例和其消费1。8GB的RAM,我怎么能进一步缩小呢? – Daniel 2010-04-27 02:31:11

你可以尝试一个探查器,就像CLRProfiler, a free download from MS(这很酷)。它可以分析服务。运行它直到看到内存峰值,然后停止并查看堆转储。

+0

好的,谢谢我也会给这个镜头 – Daniel 2010-04-27 00:46:26

听起来像你可能会做字符串连接,而不是使用StringBuilder?