【问题标题】:Castle Windsor DI container memory leaksCastle Windsor DI 容器内存泄漏
【发布时间】:2015-11-05 22:49:02
【问题描述】:

我在我的 WCF 应用服务器中使用 Castle Windsor DI 容器。在这种情况下,生命周期是每个请求的:创建一个新的服务实例,创建并安装容器,解析一些组件,完成工作并释放所有内容。

但是,经过一定数量的请求后,我的应用服务器的内存消耗会增加。当我注释掉 DI 使用情况时,我发现内存问题消失了。但是当我安装容器并解析某些组件时,会出现一些“内存泄漏”。 我发现了一些关于生命周期的文章和帖子。但它们都绑定到容器实例。由于我的容器仅在请求期间存在,因此在处理它时必须销毁所有内容。

我的服务实现了 IDisposable,并且在 Dispose 方法中我也调用了 container.Dispose。但是内存使用量会不断增长。

使用 dotMemory 分析器,我可以看到 ProxyGenerationOptions 和其他一些类的幸存者和新实例。

我错过了什么吗?为什么调用 Dispose 后容器没有释放所有使用的内存?

【问题讨论】:

  • 如果您使用 Windows permon,您会看到同样的问题吗?我问内存泄漏的原因与过度使用内存不同。换句话说,您确定这是“泄漏”吗?
  • 我相信这确实是一个泄漏。所有计数器都显示内存消耗增加。此外,dotMemory 显示了相同 Castle.* 类的显式实例数量,这些实例存在于内存中,并且在每次请求后该数量都会增加(容器创建 - 安装 - 解析 - 处置)。我想在 container.Dispose 那里所有 Castle.* 对象都会被垃圾收集。
  • 谁在记忆中保存它们?为所有 ProxyGenerationOption 对象集打开“按相似保留分组”。或打开一个实例和“密钥保留路径”视图
  • Ed.ward:保留路径仅显示“静态引用”。截图:dropbox.com/s/mjfuy0uw0fp27rs/keyRetention.png?dl=0
  • 这对我来说很奇怪 - 怎么可能在每个请求上存储新的静态引用同时保持旧的静态引用?我有一个想法:对于每个请求,我都可以在调试器加载的“DynamicProxyGenAssembly2”的输出中看到。难道静态引用被保存在这个程序集中,并且在每个请求中生成和 JITed 的新程序集,它永远不会被卸载?

标签: memory-leaks dependency-injection castle-windsor


【解决方案1】:

我遇到了类似的问题 我解决了,当我创建代理类时,我为 ModuleScope 对象提供服务

public static class ProxyFactory
{
    private static ModuleScope _moduleScope = new ModuleScope(false, false);

    public static TClass CreateProxy<TClass>(TClass instance) 
    {

                ProxyGenerator proxy = new ProxyGenerator(new DefaultProxyBuilder(_moduleScope));


                List<Type> interfaces = new List<Type>();       
                interfaces.AddRange(instance.GetType().GetInterfaces());

TClass result = proxy.CreateClassProxyWithTarget(
                instance.GetType(),
                interfaces.ToArray(),
                instance, ......

   }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多