AppDomain能夠視爲一種輕量級進程,AppDomain能夠像進程同樣獨立加載Assembly。一個Windows進程能夠包含多個AppDomain。可是與進程不一樣的是,進程與線程有隸屬關係,可是,AppDomain和進程之間是正交的,他們沒有隸屬關係。例如,一個進程存在兩個AppDomain:ADA和ADB,對象A來自ADA,對象B來自ADB,若是A的某個方法調用了B的方法,這兩個方法會在同一個線程中執行。
使用AppDomain的好處
建立AppDomain所須要的系統資源比建立一個Windows進程要少;
同一個Windows進程內的AppDomain之間能夠共享資源,如地址空間、線程、CLR等等;
Notice:
當AppDomain加載了某個Assembly後,就不能再將它從AppDomain中卸載掉,除非將整個AppDomain卸載,可是卸載AppDomain會產生很是嚴重的後果。
AppDomain的孤立性
1.
2.
3.
Host and Hosting
CLR並無和操做系統集成,進程建立時必須由本身完成加載CLR的操做。加載CLR是由運行庫宿主(Runtime Host)來完成的,Host的非託管代碼部分負責CLR的加載、配置以及將當前線程轉交給託管代碼,CLR加載完成後,Host還要負責處理未捕獲的異常等任務。一個CLR宿主與操做系統,以及CLR的關係以下圖所示。
不一樣的運行庫宿主將會影響應用程序的性能,還能夠定義應用程序可用的功能。微軟預提供的Runtime Host包括: 數據庫
弱引用
在應用程序執行期間,每一個對象在任意時刻要麼是活動的,也就是有引用指向這個對象;要麼就是非活動的,也就是沒有引用指向這個對象,也就不能再訪問這個對象了。爲了知足一些應用程序(好比緩存等)的須要,對象還能夠有第三種中間狀態,若是對象處於這樣的狀態,應用程序還能夠訪問這個對象,GC也能夠隨時釋放它。要使對象處於這樣的狀態就須要使用弱引用(weak reference)來引用對象。使用弱應用引用的對象就既能夠被應用程序訪問,又能夠被GC回收。 緩存