`

.Net CLR 内存模型小结

 
阅读更多

.Net CLR的内存模型和JVM的内存模型有很多相似的地方。《JVM 结构小结》

 

 1 进程内存空间

应用程序的内存受进程的虚拟地址空间的限制。

  • 32位进程:最多1.5GB
  • 64位进程:最多8TB

 

2 引用跟踪算法

为了解决“引用计数算法”中处理不好循环引用的问题,CLR采用了引用跟踪算法,只关心引用类型的变量——根。值类型变量直接包含实例,变量销毁,整个实例也销毁了。

 

3 GC过程

3.1 暂停线程

暂停进程中所有线程,防止它们在GC期间更改对象状态。

 

3.2 标记阶段

  1. 遍历堆中所有对象,并将同步块索引字段中的一位设为0。即假定所有对象都不可达,都是垃圾。
  2. 遍历所有(栈中的)活动根,将其引用对象的同步块索引中的位设为1,表示可达,需要保留。
  3. 检查上一步可达对象中的根,标记其引用的对象为可达。对可达对象重复执行该步骤,直到所有根都检查完毕。



 

 

3.3 压缩阶段

将需要保留的对象移到一起。更新每个根中引用对象的地址(即减去对象在内存中偏移的字节数)。

 

4 代

类似JVM内存管理中的新生代和老年代概念,.Net CLR的中也有“代”的概念。

  • CLR在分配新对象时,如果所需内存超出预算,马上执行一次GC。
  • 为了加快速度,只回收 0代 对象,忽略 1代 中的不可达对象。幸存下的 0代 对象提升为 1代。
  • 如果发现 1代 的内存占比过高,会回收 0代 和 1代 中所有不可达对象。幸存的 1代 升为 2代(最高代),0代 升为 1代。
  • 如果没有回收到足够内存,CLR会做一次完整GC。如果还是不够,就抛异常 OutOfMemoryException。
  • CLR会在GC过程中了解应用程序的行为,从而动态调节各代对象内存占比的预算。

 

5 大对象

(目前)85000字节及以上的对象被认为大对象。因为在内存中移动它的代价太高,GC一般不压缩大对象。大对象被归为 2代对象。常见的有大字符串和I/O字节数组等。

 

6 GC模式

6.1 工作站模式

为避免用户感到焦虑,GC被优化成低延时。

 

6.2 服务器模式

为提升吞吐量和资源利用率,(假定)机器的所有CPU都可用于辅助GC。托管堆被拆分为“一个CPU,一块内存区域”,每个CPU上都运行一个特殊线程,它们并发回收各自区域。

可通过配置文件启用服务器模式。

<configuration>
  <runtime>
    <gcServer enabled="true" />
  </runtime>
</configuration>

 

 

7 手动监视和控制对象的生存期

每个AppDomain一个GC句柄表,表中每一项包含堆中一个对象的引用和如何监控对象的标志(flag)。

为简化操作,用WeakReference<T>来替代GCHandle。

  • 大小: 36 KB
分享到:
评论

相关推荐

    Visual Basic.NET线程参考手册

    4.4 本章小结第5章 线程应用程序的伸缩 5.1 什么是线程池管理 5.1.1 需要线程池的情况 5.1.2 线程地的概念 5.2 CLR和线程 5.2.1 CLR在线程地管理中的角色 5.2.2 线程地管理中的问题 5.2.3 线程地的大小 5.3 ...

    ASP.NET 控件的使用

    1.5 小结 37 第2章 使用标准控件 38 2.1 显示信息 38 2.1.1 使用Label控件 38 2.1.2 使用Literal控件 42 2.2 接收用户输入 44 2.2.1 使用TextBox控件 44 2.2.2 使用CheckBox控件 50 2.2.3 使用RadioButton控件 52 ...

    ASP.NET.4揭秘

    asp.net 4揭秘.第1卷》 第一部分 构建asp.net页面 第1章 asp.net framework概览2 1.1 asp.net和.net framework5 1.1.1 框架类库5 1.1.2 公共语言运行库10 1.2 asp.net控件11 1.2.1 asp.net控件概览11 ...25.4 小结882

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    1.6 小结 62 第2章 对象和visual basic 63 2.1 面向对象的术语 64 2.1.1 对象、类和实例 64 2.1.2 对象的组成 65 2.1.3 system.object 68 2.2 使用visual basic类型 68 2.2.1 值类型和引用类型 69 ...

    ASP.NET 3.5 开发大全

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    ASP.NET3.5从入门到精通

    1.6 小结 第 2 章 C# 3.0 程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 第一篇窗口与界面编程 7 2.1.2 C# IDE 的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 ...

    ASP.NET 3.5 开发大全word课件

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    ASP.NET 3.5 开发大全11-15

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    NET环境编程全景

    1.9 小结 第2章 类型系统 2.1 编程语言和类型系统之间的关系 2.2 CLR类型系统的组成部分 2.3 值类型 2.4 引用类型 2.5 实例:用户定义对象类型 2.6 实例:值类型上接口的使用 2.7 赋值兼容性 2.8 嵌套类型 2.9 可见...

    ASP.NET 3.5 开发大全1-5

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    13.2.3 从XML中提取.NET CLR类型 431 13.2.4 ReadSubtree和XmlSerialization 433 13.2.5 用XmlWriter创建XML 435 13.2.6 2.0版本中XmlReader和XmlWriter的改进 437 13.3 XmlDocument和XPathDocument 438 13.3.1...

    ADO.NET 2.0技术内幕(高清 中文 带书签 全)

    ADO.NET 2.0技术内幕(高清 中文 带书签 全) 编辑推荐 核心主题全面涵盖,深入剖析个人精髓;示例丰富,同时提供Visual ...15.6 小结 15.7 常见问题 第Ⅴ部分 附录 附录A 使用其他.NET数据提供程序 附录B 示例和工具

    ASP.NET2.0高级编程(第4版)1/6

    1.5 小结17 第2章 Visual Studio 200519 2.1 启动页面19 2.2 文档窗口20 2.2.1 文档窗口中的视图20 2.2.2 标记导航器21 2.2.3 页面标签22 2.2.4 代码改变状态的通知23 2.2.5 错误通知和辅助23 2.3 工具箱25 2.4 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    NET设计规范-.NET约定、惯用法与模式.part1

    2.3 小结 27 第3章 命名规范 28 3.1 大小写约定 29 3.1.1 标识符的大小写规则 29 3.1.2 首字母缩写词的大小写 31 3.1.3 复合词和常用术语的大小写 33 3.1.4 是否区分大小写 35 3.2 通用命名约定 35...

    ASPNET35开发大全第一章

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

Global site tag (gtag.js) - Google Analytics