文/xugao918 出处/博客园
上一篇我们讲解了
CIL,CTS,程序集等内容,并且留下了一个问题,就是.net如何跨平台,我们现在就来弄明白这个问题.由于篇幅有限,请大家参照第一篇的图.
按照流程图我们该讲解mscoree.dll了
mscoree.dll:公共对象运行库执行引擎.由他来寻找所有要加载的dll的位置并且加载他们.然后读取程序集中的元数据.所以他又被称为CLR的垫片.
CLR:公共语言运行库.前面我们已经启动了他的垫片,那么下来就要.net的灵魂人物出场了,他就是CLR,如同Java的虚拟机一样,.net缺少了他,就成了残废了,呵呵.在mscoree.dll加载了类型以后,CLR会以特定的机器CPU来加载对应的dll(mscorwk.dll或者mscorsrv.dll,这就是.net的性能为何很好的原因),然后CLR会在内存中为类型布局,将关联的CIL,运用JIT编译成特定平台的指令.嘿嘿,也许大家已经猜到了.net是如何跨平台的了吧.因为.net的dll实际是在运行时,才全部由各平台的JIT来编译成机器指令的.所以自然就可以跨平台喽.
CLR中的GC:垃圾回收器. 我们知道.net中一般情况是不需要手动释放资源的,做过C++的人都知道手动释放资源意味着什么:莫名其妙的错误,无尽的深渊....,在.net中所有的托管资源都有GC这个保洁员来给你打扫卫生.CLR中会创建"对象图"和标示对象的"代".
1.对象图说白了就是检查对象是否还可以在被引用.
2.代这个概念是用来帮助GC快速的来检查哪些对象没有被引用,在.net中有0,1,2三代.0是新创建的对象,1是执行了一次回收以后,存在引用的对象,2是执行了一次以上回收,还存在引用的对象.GC总是从0代开始回收,如果内存已经够用,则不对1代操作,否则就检查一代是否存在没有引用的对象.执行回收,如果还不够,就清理2代.
我们来看看GC是如何工作的:
ABCDF被标示为 0代

附件:
您所在的用户组无法下载或查看附件 我们现在回收0代的对象,因为BF没有引用,所以回收他们的内存,并且压缩托管堆.
现在 ACD被标示为 1代

附件:
您所在的用户组无法下载或查看附件 如果再来一次回收如果ACD依然没有被回收,那么他们就被标示为2代.OK,现在我们明白了GC是如何来释放资源的了.
.net 进程: 一个.net进程中包含多个应用程序域,这就是.net平台操作系统独立性的关键特性,和完整的进程相比,应用程序域的CPU和内存都占用得比较少,因此CLR加载和卸载应用程序域(Appdomain)就快很多.
应用程序域(Appdomain):其中包含多个需要的Dll和上下文(Context),也就是说每个Appdomain都有mscorlib.dll等dll,下一篇中我们将介绍.net中常用的Dll.
| 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。 |