【发布时间】: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