我最近编写了一个处理大量吞吐量(每天大约 60+ 百万个请求)的小型服务,它遇到了内存问题。起初,我查看了所有常见的嫌疑人,确信这一定是我写的东西,而不是与非常有用且面向性能的 ServiceStack 库有关的东西。然而,在生产服务器上使用 windbg 到 !dumpheap -stat 时,我惊讶地发现内存中的绝大多数对象都是 System.WeakReference 类型,其中 !gcroots 指向 ServiceStack 的 Funq 容器。
我什至没有在我的服务中使用 IoC 的数据结构,所以我想知道为什么会这样?我是否错误地初始化了某些东西?我的 apphost 初始化类只是使用程序集和名称信息调用基本构造函数,我根本不重写 Configure 方法。
public SvcName() : base("SvcName", typeof(SvcName).Assembly) { }
我在其他地方读到 System.WeakReference 对象经常在极少数情况下由 .NET 插入,因为 Visual Studio 编译二进制文件时启用了“编辑并继续”调试选项,但在我的 VS 中将其关闭没有效果(大概是因为SS 二进制文件已经编译并在我的项目中被引用)。
有没有其他人遇到过这个问题?