04 2015 档案
摘要:还有另外一个性能提升举措值得注意。任何85000字节或更大的对象都被自动视为大对象。大对象从一个特殊的大对象堆中分配。这个堆中的对象采用和前面讨论过的小对象一样的方式终结和释放。但是,大对象永不压缩,因为在堆中下移85000字节内存块是浪费太多的CUP时间。但是,在写代码时,永远都不要假设大对象是不...
阅读全文
摘要:CLR启动时,会选择一种GC模式。在进程的生存期内,这个模式不能改变。有以下两种基本的GC模式。1.工作站 这个模式为客户端应用程序优化垃圾回收器。垃圾回收器假定机器上运行的其它应用程序对CPU资源的要求不高。工作站模式有两个子模式:有并发回收器的工作站,以及无并发回收器的工作站。2.服务器 这个模...
阅读全文
摘要:本章前面讨论了垃圾回收期算法。但是,这些讨论有一个很大的前提:仅有一个线程运行,在现实世界,经常会出现多个线程同时访问托管堆的情况,或至少有多个线程同时操作托管堆中分配的对象。一个线程引发垃圾回收时,其它线程绝对不能访问其他任何对(包含他们自己线程栈上的引用),这是因为垃圾回收器可能移动对象,更改其...
阅读全文
摘要:System.GC类型允许应用程序在某种程度上直接控制垃圾回收。例如:可以读取GC.MaxGeneration属性来查询托管堆支持的最大代数;该属性总是返回2。还可以调用以下静态方法来强迫执行一次垃圾回收: public static void Collect(); public static vo...
阅读全文
摘要:实现一个算法时,可能事先知道该算法需要大量内存,而且要占用大量内存。可能就这么开始执行算法,如果内存耗尽,CLR会抛出一个OutOfMemoryException。在这种情况下,以前做的大量工作都算是白费了。另外,需要捕捉这个异常,使程序得体的恢复。System.Runtime命名空间提供了一个Me...
阅读全文
摘要:有时,本地资源会消耗大量的内存,但是用于包装该资源的托管对象只占用了非常少的内存。一个典型的例子就是位图。一个位图可能占用几兆字节的本地内存,但是托管对象却极小,因为它只包含了一个hbitmap(一个4或8字节的值),从CLR角度看,一个进程可以在执行一次垃圾回收之前分配数百个位图(他们用的托管内存...
阅读全文
摘要:代是CLR垃圾回收的一种机制,它唯一的目的是提升应用程序的性能,一个基于代的垃圾回收器做出了以下几点假设。对象越新,生存期越短。对象越老,生存期越长。回收堆得一部分,速度快于回收整个堆。无数的研究证明,对于现今的大多数应用程序,这些假设都是成立的,而且这些假设影响了垃圾回收器的实现方式。本节将解释代...
阅读全文
摘要:前面“终结操作解密”讲过,需要终结一个对象被认为死亡时,垃圾回收器会强制对象重生,使它的Finalize方法得以调用。Finalize方法调用之后,对象才真正死亡。总之,需要终结的一个对象会经历死亡、重生、再死亡的“三部曲”。一个死亡的对象重生的过程称为复活。准备调用对象的Finalize方法,这是...
阅读全文
摘要:前面的代示例展示了如果调用一个类型的Dispose或Close方法。如果决定显式的调用这两个方法之一,强烈建议吧他们放在一个异常处理finally块中。这样可以保证清理代码得到执行,因此,前代码示例可以修改成下面这种更好的形式: static void Main(string[] args) { B...
阅读全文
摘要:知道类型如何实现dispose模式之后,接下来看一下开发人员怎样使用提供了dispose模式的类型。这里不再讨论前面的SafeHandle类,而是讨论更常用的FileStream类。可以利用FileStream打开一个文件,从文件中读取字节,向文件中写入字节,并关闭文件。一个FileStream对象...
阅读全文
摘要:终结操作表面上视乎很简单:创建一个对象,当它被回收时,它的Finalize方法会得到调用。但是一旦深研究下去,就会发现终结操作原非这么简单。应用程序创建一个新对象时,new操作符会从堆中分配内存。如果对象的类型定义了Finalize方法,那么在该类型的实例构造函数调用之前,会将指向该对象的一个指针放...
阅读全文
摘要:Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收1.第0代已满 第0代已满,垃圾回收会自动开始。该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽然应用程序的运行并分配新对象,这个事件会自然而然的发生。2.代码显示调用System.GC的静态方法Coll...
阅读全文
摘要:重要提示:有的人可能有这样的心态,永远不要对托管资源使用终结器,我在很大程度上赞成这个观点,所以可以完全跳过本节,对托管资源使用终结器,是非常高的编码方式,只有极少数情况下才应该使用,要是使用必须对Finalize方法中的调用的代码有一个全面和深刻的认识。另外,还必须保证调用的代码的行为在未来的版本...
阅读全文
摘要:前面我们基本了解了垃圾回收和托管堆得情况了,包含垃圾回收期如何回收对象的内存,幸运的是,大多数类型只要内存就可以正常工作,但是,另外有一些类型除了使用内存,还要使用本地资源。例如:System.IO.FileStream类型需要打开一个文件(本地资源)并保存文件的句柄。然后,该类型的Read和Wri...
阅读全文
浙公网安备 33010602011771号