还有另外一个性能提升举措值得注意。任何85000字节或更大的对象都被自动视为大对象。大对象从一个特殊的大对象堆中分配。这个堆中的对象采用和前面讨论过的小对象一样的方式终结和释放。但是,大对象永不压缩,因为在堆中下移85000字节内存块是浪费太多的CUP时间。但是,在写代码时,永远都不要假设大对象是不移动的,因为大对象的起始大小将来可能就不再是85000字节了。要百分之百保证对象在内存中不移动。
大对象总是被认为是第2代的一部分,所以只能为需要长时间存活的资源创建大对象。如果分配短时间存活的大对象,将导致第2代被更频繁的回收,这会损害性能。以下程序证明大对象总是在第2代中分配的:
Object OBJ = new Byte[85000];
Console.WriteLine(GC.GetGeneration(OBJ));
所有这些机制对于我们应用程序来说都是透明的。在开发人员面前,好像只有一个托管堆;这些机制的唯一目的就是提升应用程序性能。
时间: 2024-10-05 04:27:34