托管堆分配资源:
一:进程初始化是,CLR要保留一块联系的地址空间,这个地址空间最初并没有对应的物理存储空间。这个地址空间就是托管堆。托管堆还维护着一个指针,我把它称为NextObjPtr。它指向下个对象在堆中的分配位置。刚开始的时候NextObjPtr设为要保留地址空间的基地址。 IL指令newobj用于创建一个对象:
① 计算所有类型及其所有基类型的字段需要的字节数。
② 加上对象开销所需要的字节数。每个对象都有两个开销字段,一个是类型对象指针,和一个同步快索引。对于32应用程序各自需要32位,所以每个对象和要增加8字节。对于64位应用程序中,这每个字段个需要64位,所以每个对象要增加16字节。
③ CLR检查保留区域示范能够提供分配对象所需要的字节数,如有必要就提交存储。如果托管堆有足够的可以空间,对象就会被放入。注意对象是在NextObjPtr指针指向的地址放入的,并且为他分配的字节会被清零。接着,调用类型的实例构造器(为this参数传递NextObjPtr),IL指令newobj(或者C# new操作符)将返回对象的地址,就在地址返回之前,NextObjPtr指针的值会加上对象占据的字节数,这样会得到一个新值,它指向下一个对象放入托管堆的地址。 运行时堆是如何分配内存的:
在对象C运行时堆中,为对象分配内存需要遍历一个由数据结构组成的链表。一旦发现一个足够大的款,那个块就会被拆分,同时修改链表节点中的指针,以确保链表的完整性。从托管堆分配对象的速度几乎可与线程栈分配内存媲美。另外,大多数堆都是在他们找到可用空间的地方分配对象。所以,如果连续创建了几个对象,他们极有可能被分散,中间相隔数MB的地址空间,但在托管堆中,连续分配的对象可用确保他们在内存中是连续的。 垃圾回收器的工作原理:
应用程序调用new操作符创建对象时,可能没有足够的地址空间来来分配该对象。托管堆将对象需要的字节数加到NextObjPtr指针中的地址上来检测这种情况。如果结果值超过了地址空间的末尾,表明托管堆已满,必须执行一次垃圾回收。
垃圾回收是在第0代满的时候发生的。有的垃圾回收器使用了代的机制,该机制唯一的目的就是提升性能。其基本思路:在应用程序的生成周期中,新建的对象是新一代,二创建的比较早的是老一代。第0代是最近分配的对象,从未被垃圾回收器算法检查过。在辣鸡回收器中存活下来的对象提升到另一代(例如第一代),将对象划分为代,使辣鸡回收器能专注于回收特定的代,而不是每次都要回收托管堆这的所有对象。
代:①对象越新,生存期越短 ②对象越老,生存期越长 ③回收对的一部分,速度快于回收整个堆。托管堆在初始化时不包含任何对象。添加到堆的对象称为第0代对象。简单的说,第0代对象就是那些新构造的对象,垃圾回收器从未检查过他们。CLR初始化时,它会为第0代对象选择一个预算容量。如果分配一个新对象造成第0代超过预算,就必须启动一次垃圾回收。经过一次垃圾回收后,第0代幸存者提升至1代,第0代暂时是空的。每次垃圾回收的时候,第一代的大小增加。当第一代内存已满,则进行清理,同时第一代提升为第二代。
CLR的托管堆只支持三代:第零代,第一代,第二代,CLR初始化时会为每一代选择预算。垃圾回收器发现第0代,需要回收的垃圾非常多时,就会减小第0代的内存,频繁进行垃圾回收。如果0代需要回收的垃圾非常少时,就会减少垃圾回收,加大内存。

.Net之托管堆资源分配的更多相关文章

  1. 【CLR】解析CLR的托管堆和垃圾回收

    目录结构: contents structure [+] 为什么使用托管堆 从托管堆中分配资源 托管堆中的垃圾回收 垃圾回收算法 代 垃圾回收模式 垃圾回收触发条件 强制垃圾回收 监视内存 对包装了本 ...

  2. cir from c# 托管堆和垃圾回收

    1,托管堆基础 调用IL的newobj 为资源分配内存 初始化内存,设置其初始状态并使资源可用.类型的实列构造器负责设置初始化状态 访问类型的成员来使用资源 摧毁状态进行清理 释放内存//垃圾回收期负 ...

  3. 【C#进阶系列】21 托管堆和垃圾回收

    托管堆基础 一般创建一个对象就是通过调用IL指令newobj分配内存,然后初始化内存,也就是实例构造器时做这个事. 然后在使用完对象后,摧毁资源的状态以进行清理,然后由垃圾回收器来释放内存. 托管堆除 ...

  4. C#中的托管堆和堆栈

    托管堆(Heap)和堆栈(Stack)是内存的逻辑划分.   栈 堆 连续性 连续 不连续 有序性 后进先出 无序 内存管理 操作系统自动释放 GC或人工 存放类型 值类型/引用 引用类型 注:内存格 ...

  5. C#堆栈和托管堆

    首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 堆栈中存储值类型. 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充. 堆栈的工作方式 ...

  6. .NET 托管堆和垃圾回收

       托管堆基础 简述:每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.....事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表 ...

  7. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    原文地址:http://www.cnblogs.com/xy8.cn/articles/1227228.html 一.栈和托管堆      通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它 ...

  8. .Net 类型、对象、线程栈、托管堆运行时的相互关系

    JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...).以Main方法为例: static void Main(){ Cons ...

  9. .NET中 类型,对象,线程栈,托管堆在运行时的关系

    .NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...

随机推荐

  1. JQ 替换节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. [转]用apache反向代理解决单外网ip对应内网多个web主机的问题

    用apache反向代理解决单外网ip对应内网多个web主机的问题 转载一个有独立外网IP,需内网服务器对外发布的例子,是应用apache虚拟主机的. 来源地址:http://www.itshantou ...

  3. [Linked List]Copy List with Random Pointer

    Total Accepted: 53943 Total Submissions: 209664 Difficulty: Hard A linked list is given such that ea ...

  4. AngularJS中如何使用trigger报错$digest already in progress

    今天在使用trigger事件碰到问题: 例如我有两个按钮,button1和button2,在button2绑定了ng-click事件,现在想点击button1从而触发button2的ng-click事 ...

  5. CSS 怀疑 Verify

    1. height 之前好像看到有人说,div标签的height设置一个固定值后,div标签的height会随着内容的增多而变大 经测试,内容会溢出div标签,但div标签的height不会随着变化

  6. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  7. windows 激活远程桌面服务

  8. EntityFramework+Autofac+MVC+EasyUI 搭建公司基本服务项目

    去年年底用了2个星期的时间搭建了 这套框架,从ORM,IOC,MVC,EasyUI都仔细的研究了下,还有日志,异常等等.mvc 我已经开发过很多项目了,我就觉得自己写套框架,看看自己的水平如何.欢迎大 ...

  9. Nginx学习之二-配置项解析及编程实现

    在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息.不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以 ...

  10. 复习完毕STM32开发板

        经过半个晚上的折腾,终于复习了STM32开发板,并使用ST官方库调试完毕一个printf重定向到串口的程序,3.5的库同以前的库不大一样,不过最终搞好了可以睡觉了,还可以睡7个小时.     ...