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

c#服务中的巨大内存突发,原因可能是什么?,c#,memory,service,C#,Memory,Service,我正在开发一个c#service应用程序,我遇到了一个问题,没有任何明显的原因,进程的内存将在大约5秒钟内从150mb上升到几乎2gb,然后又回到150mb。但是我们系统中的任何东西都不应该使用接近这个内存量的任何地方(所以它可能是某个地方的一个bug)。这可能是一个紧密而真实的循环,但cpu使用率在当时非常低,所以我想我会寻找其他的想法 现在更奇怪的是,当我编译64位的服务时,除了超过10gb的ram(对大部分内存进行分页)之外,还会发生同样的大规模突发事件,这只会导致计算机和其上运行的所有东

我正在开发一个c#service应用程序,我遇到了一个问题,没有任何明显的原因,进程的内存将在大约5秒钟内从150mb上升到几乎2gb,然后又回到150mb。但是我们系统中的任何东西都不应该使用接近这个内存量的任何地方(所以它可能是某个地方的一个bug)。这可能是一个紧密而真实的循环,但cpu使用率在当时非常低,所以我想我会寻找其他的想法

现在更奇怪的是,当我编译64位的服务时,除了超过10gb的ram(对大部分内存进行分页)之外,还会发生同样的大规模突发事件,这只会导致计算机和其上运行的所有东西出现很多问题。一段时间后,它关闭了,但看起来windows仍然愿意给它更多的内存

你有什么想法或工具,我可以使用,以找到这个? 是的,它有很多日志记录,但是日志中没有任何内容能够说明为什么会发生这种情况

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

这只是偶尔发生,但通常在启动后10-20分钟左右。 在32位模式下,它会清理并继续正常运行。 64位模式它会在一段时间后崩溃,并占用大量内存。 但我真的很困惑,为什么会发生这种事


编辑:请查看对windbg帖子的推荐

您正在进行大量分配,然后发布。您的内存不断积累,直到GC启动并开始清理。在amd64平台上,所有结构都更大,因为指针、v表和其他结构的大小本质上是x86的两倍

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

.loadby sos mscorwks
!dumpheap -stat

您泄漏的类型将位于列表的顶部,并有大量的分配。这与分析内存泄漏时使用的技术相同,只是从技术上讲,内存可能没有泄漏,请参见。

您可以尝试探查器,如(非常酷)。它可以分析服务。运行它直到您看到内存峰值,然后停止它并查看堆转储。

听起来您可能正在执行字符串连接而不是使用StringBuilder?

您是否可以使用日志数据和内存使用突发的计时来了解在“突发时间”运行的代码?是的,它看起来只是正常的活动:(如果我登录了每一种方法,我可能会找到它,但那会有点臃肿>\u我现在正在尝试这个方法,如何使windbg在第一次出现异常时不停止运行,直到我说暂停?sxd。例如
sxd av
sxd eh
sxd clr
。停止时将打印要使用的异常类型。好的,布里ant,它目前的内存为2gb,我已经停止了它,运行了那些命令,这是我的问题:000007FEF9A4 EC90 74179 1895994904 System.String 74179 System.String实例及其消耗的1.8gb ram,如何进一步缩小这个范围?当我执行!gcroot命令并传递000007FEF9A4 EC90时,没有找到任何内容,它将被读取s“请注意000007fef9a4ec90不是有效对象”好的,这非常有用,我现在已经找到了问题所在!我将查看代码以找出导致问题的原因,非常感谢!