.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.

  

优质内容筛选与推荐>>
1、验证码
2、11.并发包阻塞队列之LinkedBlockingQueue
3、delphi中的 IntToHex()
4、关于epoll的IO模型是同步异步的一次纠结过程
5、C# 快速的批量修改重命名.net程序的命名空间(一)转 tianyaxiang


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号