我创建了一个运行插件的小型Windows服务。
每个插件都是一个dll,使用AppDomain
方法加载到自己的单独CreateInstanceAndUnwrap
中,并保留对AppDomain
的引用。
插件完成后,我会关闭为该插件创建的AppDomain
。我正在使用卷影副本来允许在框架中运行时更新插件。
AppDomain
中执行该dll时,它已经完全运行了6个月。
现在的工作方式是:
CreateInstanceAndUnwrap
加载和执行的,AppDomain
又负责以自己的单独OnAssemblyResolve
我有几个不同的装配位置:
我通过联系AppDomain
上的每个AppDomain
事件来解决任何不合理的dll。这允许通过网络加载dll。
现在问题是Windows服务运行了一天,内存高达1.5G。我创建了一个内存转储,似乎加载的模块只有整个1.5G的100MB,所以我不知道所有这些内存将去哪里。
使用调试我看到了堆碎片的警报,但我不知道应该从哪里开始诊断问题。通常当框架运行一天时,它消耗的东西就像100M。
这也与插件无关;当我将我的更改回滚到框架时,memroy的使用变得像以前一样正常。当我为插件创建AppDomain
时,我将{{1}}的basePath和bin路径切换到其中包含大部分dll的CORE和References文件夹,希望不再经常调用程序集解析
我查看了聚合日志,并且还阅读了一些关于加载上下文的更多内容,例如default,from和none,但我不确定这是否是正确的路径。
有什么想法吗?
答案 0 :(得分:0)
您应该尝试下载SciNet内存分析器。我确实使用该工具来诊断服务问题,它确实有助于找出问题所在。有免费的评估版本。
如果您不能或不想安装它,您可以尝试将插件拆分为两半并查看它们是否具有相同的内存行为。你也可以尝试没有插件。
此外,跨App域的垃圾收集对象似乎是tricky。您可能想要调查。