Welcome

首页 / 软件开发 / .NET编程技术 / 类型实例的创建位置、托管对象在托管堆上的结构

类型实例的创建位置、托管对象在托管堆上的结构2011-11-06 博客园 Silent Void1. 值类型实例的创建位置:

对于值类型的实例,CLR在运行时有两种分配方式:(1) 如果该值类型的实例作为类型中的方法 (Method)中的局部变量,则该实例被创建在线程栈上;(2) 如果该值类型的实例作为类型的成员,则该实 例作为引用类型(引用类型在GC堆或者LOH上创建)的实例的一部分,被创建在GC堆上。下面这段代码演示 了这两种情况:

public class Test1...{    private int i;//上面(2)中的情况,生成Test的实例的同时,int类型的实例i被创建在GC堆上    public Test1()    ...{        byte b =0;//(1)中的情况,byte类型的实例b被创建在执行这段代码的线程栈上    }}
2. 值类型实例的创建位置:

对于引用类型的实例,CLR在运行时也有两种分配方式:(1) 如果该引用类型的实例的 Size<85000Byte,则该实例被创建在GC(Garbage Collection)堆上(当CLR在分配和回收对象时,GC可 能会对GC堆进行压缩);(2) 如果该引用类型的实例的Size>=85000byte,则该实例被创建在LOH(Large Object Heap)上(LOH不会被压缩)。面这段代码演示了这两种情况:

public class Test2...{    private int[] intArr;    public Test2()    ...{        private Object o = new Object();//引用o存在线程栈上,它指向GC堆上的Object实例        intArr = new int[21250];//符合(2)中的Size条件,int数组的实例被创建在LOH上    }}