Appdomain内存问题

时间:2011-10-28 20:38:37

标签: c# .net plugins appdomain

我创建了一个运行插件的小型Windows服务。

每个插件都是一个dll,使用AppDomain方法加载到自己的单独CreateInstanceAndUnwrap中,并保留对AppDomain的引用。

插件完成后,我会关闭为该插件创建的AppDomain。我正在使用卷影副本来允许在框架中运行时更新插件。

上周,当我决定将框架的核心功能放入一个单独的dll并在一个单独的AppDomain中执行该dll时,它已经完全运行了6个月。

现在的工作方式是:

  1. Windows服务出现。
  2. 核心dll是使用CreateInstanceAndUnwrap加载和执行的,AppDomain又负责以自己的单独OnAssemblyResolve
  3. 运行插件

    我有几个不同的装配位置:

    • Bin文件夹(Windows服务的bin仅包含服务使用的dll)
    • 核心DLL文件夹(核心dll在这里被删除)
    • 引用文件夹(此处删除任何引用)
    • 插件文件夹(插件放在这里)

    我通过联系AppDomain上的每个AppDomain事件来解决任何不合理的dll。这允许通过网络加载dll。

    现在问题是Windows服务运行了一天,内存高达1.5G。我创建了一个内存转储,似乎加载的模块只有整个1.5G的100MB,所以我不知道所有这些内存将去哪里。

    使用调试我看到了堆碎片的警报,但我不知道应该从哪里开始诊断问题。通常当框架运行一天时,它消耗的东西就像100M。

    这也与插件无关;当我将我的更改回滚到框架时,memroy的使用变得像以前一样正常。当我为插件创建AppDomain时,我将{{1}}的basePath和bin路径切换到其中包含大部分dll的CORE和References文件夹,希望不再经常调用程序集解析

    我查看了聚合日志,并且还阅读了一些关于加载上下文的更多内容,例如default,from和none,但我不确定这是否是正确的路径。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您应该尝试下载SciNet内存分析器。我确实使用该工具来诊断服务问题,它确实有助于找出问题所在。有免费的评估版本。

如果您不能或不想安装它,您可以尝试将插件拆分为两半并查看它们是否具有相同的内存行为。你也可以尝试没有插件。

此外,跨App域的垃圾收集对象似乎是tricky。您可能想要调查。