.net内存分配

整理.net内存分配的认知

概要的看,

所以,值存储、引用存储是这样的

进一步想想,就知道啥时候使用ref,out关键字了。

嵌套结构,由第一幅图可知,引用类型内嵌套的值类型是存储在哪里,那么struct内有引用类型呢?存储引用类型的引用

知道了对象内存的存储,下一步CLR如何分配内存

1)计算所需空间。堆栈所需,托管堆所需。包括对象头、同步锁、实例字段

2)写屏障。不懂???

3)分别描述堆栈分配和托管堆分配。

  ·堆栈分配,OS维护着一个指针来指向下一个自由空间的地址,按高位到地位填充。释放过程则与分配过程正好相反,有堆栈指针所指实例依次向高位回收。So,堆栈中的空间,只要出了作用域,立刻就释放。同理,引用对象的引用部分也在这时释放。

  ·托管堆的分配,应用程序初始化后,CLR在进程的可用空间上分配一块保留空间,不对应任何物理地址,称之为托管堆。

  

Loader heap是存储元数据相关信息,可简称为方法表。对象头中的类型指针Type Handle就是指向Loader heap,同步锁则指向一个4byte的空间。

托管堆也维护了一个指针,指向下一个新建对象所处位置。不同的是,堆的分配是低地址向高地址扩展。

其中在分配实例字段时,是从父类到子类(一直追朔到Object类型),从高地址到低地址的。

由于NextObjPrt的分配机制,因此,连续分配的对象在内存中一定是连续的。

where is the static field? In the Loader Heap. It'll exist until the appdomain unloaded.

  

 

posted @ 2013-11-21 18:13  zzq417  阅读(209)  评论(0编辑  收藏  举报