2013-12-12 66 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可能會輕易殺死
相關問題