4

我最近编写了一个处理大量吞吐量(每天大约 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 二进制文件已经编译并在我的项目中被引用)。

有没有其他人遇到过这个问题?

4

1 回答 1

2

在 Funq 中使用 Wea​​kReference 来跟踪存储在WeakReference Stack 的一次性用品IDisposable中的 's,如此处所示。基本上,Funq 会跟踪创建的每个 WeakReference,以便在处置 Container 时将它们全部处置。IDisposable

我会先看看你是否可以减少IDisposable实例的使用(例如使用更多的单例),否则尝试修改 Funq 源代码以使用Stack<IDisposable>而不是 aStack<WeakReference>并让我知道这是否解决了你的问题,如果可以的话,我可以包含一个 opt使用 ServiceStack 中的 -in 选项来Stack<IDisposable>代替Stack<WeakReference>.

于 2013-01-16T00:06:21.053 回答