2013-12-12 23 views
0

在我们的服务器中,我们正在加载一个第三方程序集,它可以创建自己的资源,如内存和线程。我们需要创建这个第三方插件的多个实例,并且随着实例的数量增加,我们的服务器的内存和线程达到了极限。DotNet应用程序域 - 应用程序域是否提供了多进程的相同优势?

一种方法是将此插件加载到不同的exes中,这可以释放服务器资源。这将起作用,因为每个进程都将从其自己的资源池中受益。

问题是,如果我们使用AppDomain并隔离插件,它是否具有类似于在资源可用性方面的不同过程托管它的优点?

感谢, 中号...

回答

1

AppDomain不享受操作系统提供的新“资源空间”。例如,创建新的AppDomain时可用的内存空间不会扩大,这可能是对32位系统的限制。出于同样的原因,导致进程死掉的错误(如内存不足)将导致进程中的所有AppDomain一起死掉,因此未捕获的异常也会同时发生。使用进程时这是绝对错误的。

但是,.NET会将AppDomain作为外部单元进行处理。例如垃圾收集是通过它自己为每个AppDomain执行的,因此AppDomain的一个GC线程不会干扰不同的AppDomain。它可能会通过降低AppDomains之间的依赖关系来影响AppDomain消耗的CPU时间资源(尽管我从来没有试图检查其影响)。

从您的问题中,听起来像过程是首选解决方案,因为您希望为每个插件使用不同的资源池,但答案取决于您正在讨论的资源类型。

1

我的经验是,过程更灵活,比应用程序域稳定。还有的AppDomain的一些致命的局限性相比流程:

  1. 如果在AppDomain中创建线程,主机有没有关于新主题思想
  2. 如果在AppDomain中创建线程和未处理的异常被抛出在新线程中,整个过程将被终止(这是在托管第三方组件时的灾难)
  3. 如果AppDomain包含非托管代码,则无法正确卸载
  4. 即使AppDomain仅包含托管代码,不能卸载它或中止线程(例如finally块中的死循环),而一个pr可能会轻易杀死
相关问题