对象被定义后系统会给它分配一定的内存空间
类的实例也占用内存空间
new关键字是对一个对象的实例化,听人说就是给对象分配一定的内在空间
那,为实例化对象时又要重复给它分配内存呢?或者说对象所占用的内在空间和实例占用的内在空间有什么区别?
一头雾水呀,请各位大侠帮忙解释一下了,谢谢哈!
类的实例也占用内存空间
new关键字是对一个对象的实例化,听人说就是给对象分配一定的内在空间
那,为实例化对象时又要重复给它分配内存呢?或者说对象所占用的内在空间和实例占用的内在空间有什么区别?
一头雾水呀,请各位大侠帮忙解释一下了,谢谢哈!
cls = new class1();//这个时候分配内存
也就是说在new的时候分配内存
cls = new classA()
垃圾回收器要回收的目标是所有应用程序不再使用的对象所占用的内存,但是它怎么知道那些对象是否已经不再使用了哪? .net在应用程序里面定义了一个根(root)的概念,一个跟就是一个存储位置,其实就是一个引用类型的内存指针,这样的指针指向一个托管堆的对象或者null,全局引用类型变量、静态引用类型变量、一个线程堆栈上所有引用类型的本地变量或者参数变量都被认为是根(一个方法内的指向引用类型对象的cpu寄存器也是根,这样的寄存器是什么咚咚?)。 JIT编译器编译一个方法的中间语言代码的时候,除了产生CPU的本地代码外,还会创建一个内部表,该表中标识一个方法的本地指令的字节偏移范围和一组包含根的内存地址(CPU寄存器)。垃圾回收器会遍历线程的调用堆栈,通过检测其中每一个方法的内部表来确定调用方法的根;另外,GC会利用一些手段来获得全局应用类型变量和静态引用类型变量。GC遍历线程的调用堆,将直接可达的根构造一个可达对象图,我们会发现会有根在应用另外的根,在所达根不重复的前提下,最终构造出完全可达根图,于是在这个堆栈上不可达的对象便是GC收集的目标!还没完,如果找到一个较大的连续空间,GC会把非垃圾对象搬移过来,并且GC会自动矫正他们的位置。 可见垃圾回收对程序性能会有影响,但是我们需要明确的有几点:只有第0代对象充满的时候,才会回收;CLR提供特殊的优化设计来提高垃圾回收的性能。 到此为止,我们就明白在.net程序中为什么不再出现资源泄露和对象状态不稳定的bug了!