随笔 - 22  文章 - 2 评论 - 383 trackbacks - 53

文章转载,请加入本Blog链接

我参加的小组

我参与的团队

随笔分类

文章分类

我的好友

积分与排名

  • 积分 - 64762
  • 排名 - 642

      (声明:本系列只想给大家介绍.net框架,并不是语法和类的使用的讲解,所以只能概括的描述一下所提到的类,如果有疑问可以到MSDN上面去查)            

 

 上一篇我们讲解了CIL,CTS,程序集等内容,并且留下了一个问题,就是.net如何跨平台,我们现在就来弄明白这个问题.由于篇幅有限,请大家参照第一篇的图.
按照流程图我们该讲解mscoree.dll了
         

        由相关的.net进程来加载Mscoree.dll,对于相关进程我们在后面讲到Winform,ASP.NET时,将继续讲解.
        mscoree.dll:公共对象运行库执行引擎.由他来寻找所有要加载的dll的位置并且加载他们(必须包含mscorlib.dll 他是核心类库,包含大量的核心类型,System,system.io等).然后读取程序集中的元数据.所以mscoree.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,经过了这一步,就该是具体的应用程序了,如ASP.Net,WPF等不同形式的应用程序,再后续的文章里,将介绍他们的框架,最后再整合起来,就是完整的.net框架了,在这之前,我们先来学习一下.net中重要的几个Dll,给新  人打一下基础,高手们就不用看了,不过希望高手们可以指教一下。

 

下几篇中介绍.net中常用的Dll,然后再对各种应用程序做图解。

 

       下一篇:       .NET 框架与架构模式和设计模式详解系列(图解DotNet框架)之二:.Net 基本数据类型(引用与值类型的区别),System.dll的功能
 

posted on 2008-07-21 11:34 涵舍愚人 阅读(2779) 评论(29)  编辑 收藏 所属分类: 图解DotNet框架系列

FeedBack:
#1楼  2008-07-21 11:40 Simens      
沙发
  回复  引用  查看    
#2楼  2008-07-21 11:46 zhiming99      
完了?... ...
  回复  引用  查看    
#3楼 [楼主] 2008-07-21 11:48 涵舍愚人      
@包建强
这只是刚开始,到后面才会讲到.net中的架构模式和设计模式.还有WPF等的东西,我只是想把知识图做出来,并没有详细的类实用代码,这种东西太多了,有很多高人都写得很好了.
  回复  引用  查看    
#4楼 [楼主] 2008-07-21 11:48 涵舍愚人      
@zhiming99
还没有写完,早着呢..赫赫
  回复  引用  查看    
#5楼 [楼主] 2008-07-21 11:50 涵舍愚人      
大家可能有些误解,我做的是一个系列,这只是系列中的很小一小部分
  回复  引用  查看    
辛苦啦!
  回复  引用    
#7楼  2008-07-21 12:35 横刀天笑      
支持,
  回复  引用  查看    
#8楼  2008-07-21 12:47 ylgqq [未注册用户]
楼主的图是用Viso做的吗?这样截图可不怎么好看。
  回复  引用    
#9楼  2008-07-21 13:01 斧头帮少帮主      
继续啊,100%支持,内容不够看,一下就到头了...不解渴!!!
  回复  引用  查看    
#10楼  2008-07-21 13:02 斧头帮少帮主      
不过你的模板怎么没有cnblogs首页的链接,比较郁闷...
  回复  引用  查看    
#11楼  2008-07-21 13:14 Anytao      
--引用--------------------------------------------------
2是执行了一次以上回收,还存在引用的对象.
--------------------------------------------------------

2代对象的说法是不准确的,2代对象不一定是执行一次以上回收,还存在引用的对象。更精确的说法是对1代对象执行垃圾回收之后还没有被清理的对象,则升为2代对象,而对1代对象执行垃圾回收,取决于0代对象是否溢出,或者是否调用GC.Collect(1)等条件。
  回复  引用  查看    
#12楼 [楼主] 2008-07-21 13:25 涵舍愚人      
@ylgqq
呵呵,那你给我点建议,我画图的水平不高啊....
  回复  引用  查看    
#13楼 [楼主] 2008-07-21 13:26 涵舍愚人      
--引用--------------------------------------------------
Anytao: --引用--------------------------------------------------
2是执行了一次以上回收,还存在引用的对象.
--------------------------------------------------------

2代对象的说法是不准确的,2代对象不一定是执行一次以上回收,还存在引用的对象。更精确的说法是对1代对象执行垃圾回收之后还没有被清理的对象,则升为2代对象,而对1代对象执行垃圾回收,取决于0代对象是否溢出,或者是否调用GC.Collect(1)等条件。
--------------------------------------------------------
谢谢你的更正,这里用词不当.....改!
  回复  引用  查看    
#14楼 [楼主] 2008-07-21 13:27 涵舍愚人      
--引用--------------------------------------------------
斧头帮少帮主: 继续啊,100%支持,内容不够看,一下就到头了...不解渴!!!
--------------------------------------------------------
我正在努力,希望可以共同学习,谢谢你的支持
  回复  引用  查看    
#15楼 [楼主] 2008-07-21 13:28 涵舍愚人      
--引用--------------------------------------------------
斧头帮少帮主: 不过你的模板怎么没有cnblogs首页的链接,比较郁闷...
--------------------------------------------------------
第一次写Blog,页面设置还没有作,不好意思
  回复  引用  查看    
#16楼  2008-07-21 14:00 水言木      
美文,顶!
喜欢这样又简洁又没有太多代码的文章了。
  回复  引用  查看    
#17楼 [楼主] 2008-07-21 14:01 涵舍愚人      
--引用--------------------------------------------------
水言木: 美文,顶!
喜欢这样又简洁又没有太多代码的文章了。
--------------------------------------------------------
呵呵,谢谢你,我希望用图,更简单得来表达.因为我的文笔不好,表达不清楚,哈哈

  回复  引用  查看    
#18楼  2008-07-21 14:06 T2噬菌体      
非常期待你的下文,尤其是WPF,WCF和WF那一块,我非常感兴趣
  回复  引用  查看    
#19楼 [楼主] 2008-07-21 14:10 涵舍愚人      
--引用--------------------------------------------------
T2噬菌体: 非常期待你的下文,尤其是WPF,WCF和WF那一块,我非常感兴趣
--------------------------------------------------------
谢谢你的鼓励,我会努力加油的,尽快写完,不过....很多阿.....
  回复  引用  查看    
#20楼  2008-07-21 14:40 Seattle      
貌似.net垮平台跟java跨平台都一样啊。所谓的跨平台还不都是要求不同系统装自己的虚拟机。不知对否?
  回复  引用  查看    
#21楼 [楼主] 2008-07-21 14:43 涵舍愚人      
--引用--------------------------------------------------
Seattle: 貌似.net垮平台跟java跨平台都一样啊。所谓的跨平台还不都是要求不同系统装自己的虚拟机。不知对否?
--------------------------------------------------------
原理上是一样的,只不过.net Framework,集成了这些东西。
  回复  引用  查看    
#22楼  2008-07-22 09:45 雅阁布      
不错!!
up!!
  回复  引用  查看    
#23楼 [楼主] 2008-08-07 10:36 涵舍愚人      
@雅阁布
谢谢关注
  回复  引用  查看    
#24楼  2008-08-07 13:50 青衣书生      
我是个菜鸟,有很多地方都不是很清楚,可能问题比较白痴,不过还请不要笑话我,谢谢

1.到底是在 mscoree.dll 里加载了DLL,还是在CLR中加载了DLL哪?我看到在图中CLR中也有个类加载。
2.我不太明白最后一步,生成进程以后,里面的各个应用程序域是什么?是程序的各种不同的操作吗?还有就是每个应用程序域里是不是程序中所引用的所有DLL和上下文?
3.还有就是垃圾回收器再到达2代后,如果还有在执行的话,是不是回收2代,然后依然表示为2代。

  回复  引用  查看    
#25楼 [楼主] 2008-08-07 15:26 涵舍愚人      
@青衣书生
1.CLR中加载了DLL
2.程序中所引用的所有DLL和上下文,说白了就是你写的程序
3.垃圾回收器再到达2代后,回收2代没有根的对象,没有回收的依然表示为2代
  回复  引用  查看    
#26楼  2008-08-07 21:24 青衣书生      
谢谢楼主!:)
  回复  引用  查看    
#27楼 [楼主] 2008-08-07 23:08 涵舍愚人      
--引用--------------------------------------------------
青衣书生: 谢谢楼主!:)
--------------------------------------------------------
不客气...
  回复  引用  查看    
#28楼  2008-08-18 11:30 BeatOfAngle      
简洁明了,好东西。。
学习中
  回复  引用  查看    
#29楼 [楼主] 2008-08-18 11:42 涵舍愚人      
--引用--------------------------------------------------
BeatOfAngle: 简洁明了,好东西。。
学习中
--------------------------------------------------------
谢谢关注
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-23 17:48 编辑过


相关链接: