摘要: 前面已经讨论了宿主以及宿主加载CLR的方式。同时还讨论了宿主如何告诉CLR创建和卸载AppDomain。为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形。特别地,我要解释不同应用程序类型如何宿主CLR,以及他们如何管理AppDomain。1 可执行应用程序控制台UI应用程... 阅读全文
posted @ 2015-05-12 09:38 -祐扌戒恉- 阅读(393) 评论(0) 推荐(0)
摘要: 每个AppDomain都可关联一组回调方法;CLR开始查找AppDomain中的catch块时,这些回调方法就会得到调用。这些方法可执行日志记录操作。除此之外,宿主可利用这个机制监视AppDomain中抛出的异常。回调方法不处理异常,也不能以任何方式吃掉它;他们只是接受关于异常已经发生的一个通知。为... 阅读全文
posted @ 2015-05-12 09:25 -祐扌戒恉- 阅读(225) 评论(0) 推荐(0)
摘要: 宿主应用程序可监视AppDomain消耗的资源。有的宿主根据这种信息判断一个AppDomain的内存或CPU消耗是否超过了应有的水准,并强制卸载一个AppDomain。还可以利用监视来比较不同算法的资源消耗情况,判断哪种算法用的资源较少。由于AppDomain监视本身也会产生开销,所以宿主必须将Ap... 阅读全文
posted @ 2015-05-11 22:59 -祐扌戒恉- 阅读(427) 评论(0) 推荐(0)
摘要: AppDomain很出色的一个能力就是它允许卸载。卸载AppDomain会导致CLR卸载AppDomain中的所有程序集。还会释放AppDomain的Loader堆。为了卸载一个AppDomain,可调用AppDomain的静态方法Unload。这将导致CLR执行一系列操作来得体的卸载指定AppDo... 阅读全文
posted @ 2015-05-11 19:43 -祐扌戒恉- 阅读(309) 评论(0) 推荐(0)
摘要: CLR COM服务器初始化时,会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。CLR初始化时创建的第一个AppDomain称为默认的AppDomain,这个默认的AppDomain只有在Windonws进程终止时才能被撤销。除了默认的AppDomain,正在使用非托管Com接... 阅读全文
posted @ 2015-05-10 18:46 -祐扌戒恉- 阅读(405) 评论(0) 推荐(0)
摘要: 本系列文章来自 CLR VIA C#.NET FrameWork在Microsoft Windows平台的顶部运行。这意味着.NET必须用Windows可以理解的技术来构建。首先,所有的托管模块和程序集文件都必须使用Windows PE文件格式,而且要么是一个Windows.exe文件,要么是一个D... 阅读全文
posted @ 2015-05-10 14:54 -祐扌戒恉- 阅读(449) 评论(0) 推荐(0)
摘要: 在一个进程中,可以调用几个方法来监视垃圾回收器。具体的说,GC类提供了以下静态方法,可调用他们查看某一代发生了多少次垃圾回收,或者托管堆中的对象当前使用了多少内存。public static long GetTotalMemory(bool forceFullCollection);public s... 阅读全文
posted @ 2015-05-10 12:26 -祐扌戒恉- 阅读(193) 评论(0) 推荐(0)
摘要: 还有另外一个性能提升举措值得注意。任何85000字节或更大的对象都被自动视为大对象。大对象从一个特殊的大对象堆中分配。这个堆中的对象采用和前面讨论过的小对象一样的方式终结和释放。但是,大对象永不压缩,因为在堆中下移85000字节内存块是浪费太多的CUP时间。但是,在写代码时,永远都不要假设大对象是不... 阅读全文
posted @ 2015-04-29 23:09 -祐扌戒恉- 阅读(204) 评论(0) 推荐(0)
摘要: CLR启动时,会选择一种GC模式。在进程的生存期内,这个模式不能改变。有以下两种基本的GC模式。1.工作站 这个模式为客户端应用程序优化垃圾回收器。垃圾回收器假定机器上运行的其它应用程序对CPU资源的要求不高。工作站模式有两个子模式:有并发回收器的工作站,以及无并发回收器的工作站。2.服务器 这个模... 阅读全文
posted @ 2015-04-29 23:05 -祐扌戒恉- 阅读(307) 评论(0) 推荐(0)
摘要: 本章前面讨论了垃圾回收期算法。但是,这些讨论有一个很大的前提:仅有一个线程运行,在现实世界,经常会出现多个线程同时访问托管堆的情况,或至少有多个线程同时操作托管堆中分配的对象。一个线程引发垃圾回收时,其它线程绝对不能访问其他任何对(包含他们自己线程栈上的引用),这是因为垃圾回收器可能移动对象,更改其... 阅读全文
posted @ 2015-04-28 22:00 -祐扌戒恉- 阅读(711) 评论(0) 推荐(0)