我最近编写了一个处理大量吞吐量的小型服务(每天大约6000万个请求),并且遇到了内存问题.起初,我查看了所有常见的嫌疑人,他们确信这必须是我写的东西,而不是与非常有用的面向性能的ServiceStack库有关.然而,在生产服务器上使用windbg!dumpheap -stat后,我惊讶地发现内存中的绝大多数对象都是带有!gcroots指向ServiceStack的Funq容器的System.WeakReference类型.
我甚至没有在我的服务中使用IoC的数据结构,所以我想知道为什么会发生这种情况?我是否错误地初始化了什么?我的apphost初始化类只是使用程序集和名称信息调用基本构造函数,我根本不会覆盖Configure方法.
public SvcName() : base("SvcName", typeof(SvcName).Assembly) { }
我在其他地方读到,由于Visual Studio编译了具有“编辑并继续”调试选项的二进制文件,System.WeakReference对象通常由.NET插入,但是在我的VS中将其关闭没有任何影响(可能是因为SS二进制文件已经编译并在我的项目中引用了).
还有其他人有过这个问题吗?
最佳答案 Funq中使用WeakReference来跟踪存储在
WeakReference Stack of disposables as seen here中的IDisposable.基本上Funq跟踪创建的每个IDisposable WeakReference,以便在处理Container时它们都可以被处理掉.
我首先看看你是否可以减少使用IDisposable实例(例如使用更多单例),否则尝试修改Funq源代码以使用Stack< IDisposable>而不是Stack< WeakReference>并告诉我这是否可以解决您的问题,如果可以,我可以在ServiceStack中包含一个选择加入选项以使用Stack< IDisposable>而不是Stack< WeakReference>.