AppDomain是CLR(Common Language Runtime:公共语言运行库),它可以加载Assembly、创建对象以及执行程序。

  AppDomain是CLR实现代码隔离的基本机制。

  每一个AppDomain可以单独运行、停止;每个AppDomain都有自己默认的异常处理;一个AppDomain的运行失败不会影响到其他AppDomain的运行。

  CLR在被CLR Host(windows shell or InternetExplorer or SQL Server)加载后,会创建一个默认的AppDomain,程序的入口点(main方法)就是在这个默认的AppDomain中执行。

  1、AppDomain与进程比较:

    AppDomain被创建是在进程中,一个进程中可以有多个AppDomain,但一个AppDomain只能属于一个进程。

  2、AppDomain与线程比较:

    与线程,Appdomain是个静态概念,知识限定了对象的边界;线程是个动态的概念,它可以运行在不同的AppDomain中。一个AppDomain内可以创建多个线程,但是不能限定这些线程只能在本AppDomain内执行代码。

    CLR中的System.Threading.Thread对象其实是个soft thread,它并不能被操作系统识别;操作系统能识别的是hard thread。一个soft thread只属于一个ppDomain,穿越AppDomain的是hard thread。当hard thread访问到某个AppDomain时,一个AppDomain就会产生一个soft thread。

    hard thread有thread local storage(TLS),这个存储区被CLR用来存储hard thread当前对应的AppDomain引用以及soft thread引用。当一个hard thread穿越到另外一个AppDomain时,TLS中的这些引用也会改变。

  3、AppDomain与Assembly的比较:

    Assembly是.net程序的基本部署单元,它可以为CLR提供识别类型的元数据等等。Assembly不能单独执行,必须被加载到AppDomain中,然后由AppDomain创建程序集中的对象。一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。每个AppDomain引用到某个类型的时候需要把相应的assembly在各自的AppDomain中初始化。因此,每个AppDomain会单独保持一个类的静态变量。

  4、AppDomain与对象的比较:

    任何对象只能属于一个AppDomain,AppDomain用来隔离对象,不同AppDomain之间的对象必须通过Proxy(reference type)或者Clone(value type)通信。

    引用类型需要继承System.MarshalByRefObject才能被Marshal/UnMarshal(Proxy)。
    值类型需要设置Serializable属性才能被Marshal/UnMarshal(Clone)。

  5、AppDomain与Assembly Code    

    AppDomain和程序集的源代码是什么关系呢?每个程序集的代码会分别装载到各个AppDomain中?
    首先我们要把程序集分3类
    1.mscorlib,这是每个.net程序都要引用到的程序集。
    2.GAC,这个是强命名的公用程序集,可以被所有的.net程序引用。
    3.Assembly not in GAC,这是普通的assembly,可以不是强命名,不放到GAC中。
      启动CLR,进入entry point时可以设置LoaderOptimization属性:
      [LoaderOptimization(LoaderOptimization.MultiDomain]
      static void Main()
      {...}
    LoaderOptimization属性可以设置三个不同的枚举值,来设置针对前面说的三种程序集的代码存放以及访问方式。
    LoaderOptimization Enumeration/Attribute

Value Expected Domains in Process Each Domain Expected to Run ... Code for MSCORLIB Code for Assemblies in GAC Code for Assemblies not in GAC
SingleDomain One N/A Per-process Per-domain Per-domain
MultiDomain Many Same Program Per-process Per-process Per-process
MultiDomainHost Many Different Programs Per-process Per-process Per-domain

    1.SingleDomain,由于只启动一个AppDomain,那么code就被直接装载到了AppDomain中,访问静态变量更快捷。

    2.MultiDomain,所有的Assembly代码是进程级别的,因此所有的AppDomain只访问一份代码。这大大减少了程序占用的内存,但是由于程序集的静态变量仍然在各个AppDomain中,因此代码访问静态变量需要先得到AppDomain的引用再进行转换,速度会受到影响。
    3.MultiDomainHost,只有GAC代码是共享的,非GAC的Assembly依然会加载到被使用的AppDomain中,这样提高静态变量的访问速度,当然也增加程序占用内存。 
    不管是哪种方式,mscorlib始终是process级别的,即只有一份mscorlib代码在内存中。
 
  详细参考:http://www.cnblogs.com/foman/archive/2009/10/18/1585655.html

System.AppDomain类详解(一)的更多相关文章

  1. System.AppDomain类详解(二)

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  2. java之StringBuffer类详解

    StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...

  3. java之AbstractStringBuilder类详解

    目录 AbstractStringBuilder类 字段 构造器 方法   public abstract String toString() 扩充容量 void  expandCapacity(in ...

  4. JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表

    一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public ...

  5. C# 内置 DateTime类详解

    C# 内置 DateTime类详解 摘抄自微软官方文档,用来方便自己查阅:网址:https://msdn.microsoft.com/zh-cn/library/system.datetime(v=v ...

  6. Java 枚举类详解

    1. 枚举类定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类. 2. 早期实现枚举的方式 public static f ...

  7. URLConnection类详解-转

    转-http://www.cnblogs.com/shijiaqi1066/p/3753224.html 1. URLConnection概述 URLConnection是一个抽象类,表示指向URL指 ...

  8. JDK中Unsafe类详解

    Java中Unsafe类详解 在openjdk8下看Unsafe源码 浅析Java中的原子操作 Java并发编程之LockSupport http://hg.openjdk.java.net/jdk7 ...

  9. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

随机推荐

  1. java服务器图片压缩的几种方式及效率比较

    以下是测试了三种图片压缩方式,通过测试发现使用jdk的ImageIO压缩时间更短,使用Google的thumbnailator更简单,但是thumbnailator在GitHub上的源码已经停止维护了 ...

  2. iphone的ibooks如何导入pdf?

    使用QQ把pdf文档从电脑上发到手机上,使用手机的QQ打开文档,在手机QQ上,用其他应用打开文档,选择‘拷贝’到ibooks

  3. Java之旅(1)—Class类

    看到Class的时候,我们是不是会一下子想到我们敲代码中的class呢?此Class非彼class,这里讲的Class类实际上就是java类的统称,我们能够将其称之为抽象的类不是详细的一个类的名字. ...

  4. linux man 1,2,3 命令

    原文: http://blog.sina.com.cn/s/blog_969c52730101c0p7.html ------------------------------------------- ...

  5. 免费好用的Microsoft iSCSI Software Target 3.3

    我们在搭建Windows群集的时候往往会使用到IP-SAN.但是面对昂贵的硬件IP-SAN,我们在学习和实验的环境中更加多的用到的往往是软件模拟的IP-SAN.今天就给大家介绍一个微软出品的免费iSC ...

  6. UML基础与应用总结

          敲响一段键盘的乐响曲,一段路程留下一些足迹.       UML.是Unified-Modeling-Language的缩写. 首先要明白知道它是一种可视化的建模语言.   什么是UML基 ...

  7. ZOJ 3819 Average Score 水

    水 Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar Univer ...

  8. 怎样在Swift中使用NSError

    步骤一:声明NSError变量. 一定要加"?",不加或者加"!"都不行.由于使用了optional,所以要用var而不用let. var error: NSE ...

  9. C++入门学习——模板

    为什么须要模板? 我们已经学过重载(Overloading),对重载函数而言,C++ 通过函数參数(參数个数.參数类型)的正确匹配来调用重载函数.比如.为求两个数的最大值,我们定义 max () 函数 ...

  10. HDUOJ Number Sequence 题目1005

     /*Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...