servicestack,edit-and-continue,funq,Memory Leaks,servicestack,Edit And Continue,Funq" /> servicestack,edit-and-continue,funq,Memory Leaks,servicestack,Edit And Continue,Funq" />

Memory leaks ServiceStack Funq容器弱引用扩散

Memory leaks ServiceStack Funq容器弱引用扩散,memory-leaks,servicestack,edit-and-continue,funq,Memory Leaks,servicestack,Edit And Continue,Funq,我最近写了一个小服务,它可以处理大量的吞吐量(每天6000多万个请求),但它遇到了内存问题。首先,我查看了所有常见的疑点,确信它必须是我编写的,而不是与非常有用、非常面向性能的ServiceStack库相关的。在使用windbg时!然而,在生产服务器上的dumpheap-stat中,我惊奇地发现内存中的绝大多数对象都是带有!gcroot指向ServiceStack的Funq容器 我甚至没有在我的服务中使用IoC的数据结构,所以我想知道为什么会发生这种情况?我初始化错误了吗?我的apphost i

我最近写了一个小服务,它可以处理大量的吞吐量(每天6000多万个请求),但它遇到了内存问题。首先,我查看了所有常见的疑点,确信它必须是我编写的,而不是与非常有用、非常面向性能的ServiceStack库相关的。在使用windbg时!然而,在生产服务器上的dumpheap-stat中,我惊奇地发现内存中的绝大多数对象都是带有!gcroot指向ServiceStack的Funq容器

我甚至没有在我的服务中使用IoC的数据结构,所以我想知道为什么会发生这种情况?我初始化错误了吗?我的apphost initialize类只使用程序集和名称信息调用基本构造函数,我根本不重写Configure方法

public SvcName() : base("SvcName", typeof(SvcName).Assembly) { }
我在别处读到,System.WeakReference对象通常由.NET插入,这是因为Visual Studio编译二进制文件时启用了“编辑并继续”调试选项,但在我的VS中禁用该选项没有任何效果(可能是因为SS二进制文件已经编译,并且只是在我的项目中引用)


其他人有过这个问题吗?

在Funq中使用WeakReference跟踪存储在数据库中的
IDisposable
。基本上Funq会跟踪每个创建的
IDisposable
WeakReference,以便在容器被释放时,它们都可以被释放


首先,我想看看您是否可以减少使用
IDisposable
实例(例如,使用更多的单例),否则请尝试修改Funq源代码以使用
Stack
而不是
Stack
,并告诉我这是否解决了您的问题,如果有,我可以在ServiceStack中包含一个opt-in选项,以使用
Stack
而不是
Stack

谢谢您的回复!真正让我困惑的是,我根本没有使用Funq来存储任何对象。我的服务只是有一个我正在使用的静态属性(我知道,IoC很好,等等),但我想知道,如果我没有注册任何东西,为什么它会分配到IDisposable堆栈?好的,它不应该这样做,我会调查它,确保它在使用外部IoC时不会跟踪IDisposable。谢谢调查。我刚刚将我们的服务更改为从RestServiceBase继承,内存使用率比使用新服务基类时低。我知道这是不赞成的,但两者之间的Funq行为有什么变化吗?我之所以这么问,是因为我们使用ServiceStack 3.9.28编写的早期服务(尽管流量较少)已经运行了好几个星期,所以我们尝试将旧API与内存泄漏服务一起使用。只是
服务
基类已经为您注册了更多依赖项。尝试改用空的
IService
接口来实现您的服务,该接口没有任何dep。我更新了我们的服务以继承IService而不是服务基类,今天晚些时候我将报告这是否解决了内存问题。