摘要: System.GC类型允许应用程序在某种程度上直接控制垃圾回收。例如:可以读取GC.MaxGeneration属性来查询托管堆支持的最大代数;该属性总是返回2。还可以调用以下静态方法来强迫执行一次垃圾回收: public static void Collect(); public static vo... 阅读全文
posted @ 2015-04-27 19:27 -祐扌戒恉- 阅读(234) 评论(0) 推荐(0)
摘要: 实现一个算法时,可能事先知道该算法需要大量内存,而且要占用大量内存。可能就这么开始执行算法,如果内存耗尽,CLR会抛出一个OutOfMemoryException。在这种情况下,以前做的大量工作都算是白费了。另外,需要捕捉这个异常,使程序得体的恢复。System.Runtime命名空间提供了一个Me... 阅读全文
posted @ 2015-04-24 20:33 -祐扌戒恉- 阅读(257) 评论(0) 推荐(0)
摘要: 有时,本地资源会消耗大量的内存,但是用于包装该资源的托管对象只占用了非常少的内存。一个典型的例子就是位图。一个位图可能占用几兆字节的本地内存,但是托管对象却极小,因为它只包含了一个hbitmap(一个4或8字节的值),从CLR角度看,一个进程可以在执行一次垃圾回收之前分配数百个位图(他们用的托管内存... 阅读全文
posted @ 2015-04-24 20:26 -祐扌戒恉- 阅读(193) 评论(0) 推荐(0)
摘要: 代是CLR垃圾回收的一种机制,它唯一的目的是提升应用程序的性能,一个基于代的垃圾回收器做出了以下几点假设。对象越新,生存期越短。对象越老,生存期越长。回收堆得一部分,速度快于回收整个堆。无数的研究证明,对于现今的大多数应用程序,这些假设都是成立的,而且这些假设影响了垃圾回收器的实现方式。本节将解释代... 阅读全文
posted @ 2015-04-22 19:40 -祐扌戒恉- 阅读(160) 评论(0) 推荐(0)
摘要: 前面“终结操作解密”讲过,需要终结一个对象被认为死亡时,垃圾回收器会强制对象重生,使它的Finalize方法得以调用。Finalize方法调用之后,对象才真正死亡。总之,需要终结的一个对象会经历死亡、重生、再死亡的“三部曲”。一个死亡的对象重生的过程称为复活。准备调用对象的Finalize方法,这是... 阅读全文
posted @ 2015-04-21 18:54 -祐扌戒恉- 阅读(225) 评论(0) 推荐(0)
摘要: 前面的代示例展示了如果调用一个类型的Dispose或Close方法。如果决定显式的调用这两个方法之一,强烈建议吧他们放在一个异常处理finally块中。这样可以保证清理代码得到执行,因此,前代码示例可以修改成下面这种更好的形式: static void Main(string[] args) { B... 阅读全文
posted @ 2015-04-15 21:23 -祐扌戒恉- 阅读(305) 评论(0) 推荐(0)
摘要: 知道类型如何实现dispose模式之后,接下来看一下开发人员怎样使用提供了dispose模式的类型。这里不再讨论前面的SafeHandle类,而是讨论更常用的FileStream类。可以利用FileStream打开一个文件,从文件中读取字节,向文件中写入字节,并关闭文件。一个FileStream对象... 阅读全文
posted @ 2015-04-07 23:57 -祐扌戒恉- 阅读(230) 评论(0) 推荐(0)
摘要: 终结操作表面上视乎很简单:创建一个对象,当它被回收时,它的Finalize方法会得到调用。但是一旦深研究下去,就会发现终结操作原非这么简单。应用程序创建一个新对象时,new操作符会从堆中分配内存。如果对象的类型定义了Finalize方法,那么在该类型的实例构造函数调用之前,会将指向该对象的一个指针放... 阅读全文
posted @ 2015-04-05 10:09 -祐扌戒恉- 阅读(205) 评论(1) 推荐(0)
摘要: Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收1.第0代已满 第0代已满,垃圾回收会自动开始。该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽然应用程序的运行并分配新对象,这个事件会自然而然的发生。2.代码显示调用System.GC的静态方法Coll... 阅读全文
posted @ 2015-04-05 08:47 -祐扌戒恉- 阅读(710) 评论(0) 推荐(0)
摘要: 重要提示:有的人可能有这样的心态,永远不要对托管资源使用终结器,我在很大程度上赞成这个观点,所以可以完全跳过本节,对托管资源使用终结器,是非常高的编码方式,只有极少数情况下才应该使用,要是使用必须对Finalize方法中的调用的代码有一个全面和深刻的认识。另外,还必须保证调用的代码的行为在未来的版本... 阅读全文
posted @ 2015-04-03 21:45 -祐扌戒恉- 阅读(185) 评论(0) 推荐(0)