.Net CLR的内存模型和JVM的内存模型有很多相似的地方。《JVM 结构小结》
1 进程内存空间
应用程序的内存受进程的虚拟地址空间的限制。
- 32位进程:最多1.5GB
- 64位进程:最多8TB
2 引用跟踪算法
为了解决“引用计数算法”中处理不好循环引用的问题,CLR采用了引用跟踪算法,只关心引用类型的变量——根。值类型变量直接包含实例,变量销毁,整个实例也销毁了。
3 GC过程
3.1 暂停线程
暂停进程中所有线程,防止它们在GC期间更改对象状态。
3.2 标记阶段
- 遍历堆中所有对象,并将同步块索引字段中的一位设为0。即假定所有对象都不可达,都是垃圾。
- 遍历所有(栈中的)活动根,将其引用对象的同步块索引中的位设为1,表示可达,需要保留。
- 检查上一步可达对象中的根,标记其引用的对象为可达。对可达对象重复执行该步骤,直到所有根都检查完毕。
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。
相关推荐
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 ...
### 小结 通过上述命令,您可以在支持的Windows系统上安装.NET Framework 3.5。这不仅适用于开发环境的设置,也适用于服务器环境的配置,确保应用程序能够正常运行。需要注意的是,在执行上述命令之前,请确保已经...
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 ...
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 声明并初始化变量 ...
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 命名规则和命名习惯 ...
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 声明并初始化变量 ...
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 声明并初始化变量 ...
1.9 小结 第2章 类型系统 2.1 编程语言和类型系统之间的关系 2.2 CLR类型系统的组成部分 2.3 值类型 2.4 引用类型 2.5 实例:用户定义对象类型 2.6 实例:值类型上接口的使用 2.7 赋值兼容性 2.8 嵌套类型 2.9 可见...
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 声明并初始化变量 ...
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技术内幕(高清 中文 带书签 全) 编辑推荐 核心主题全面涵盖,深入剖析个人精髓;示例丰富,同时提供Visual ...15.6 小结 15.7 常见问题 第Ⅴ部分 附录 附录A 使用其他.NET数据提供程序 附录B 示例和工具
- **公用语言运行时(CLR)**:CLR是.NET框架的核心组件之一,负责管理内存分配、垃圾回收、异常处理等底层细节。 - **公用语言规范(CLS)**:CLS定义了一组规则,确保不同语言编写的代码可以互操作。遵循这些规则...
**1.3 小结** 通过学习ASP.NET,开发者不仅能够掌握先进的Web开发技能,还能深入了解微软.NET平台的生态系统,为构建高性能、可扩展的Web应用打下坚实基础。 #### 第二篇 WebForm ##### WebForm简介 WebForm是...
- **2.8 小结**:总结了CLR的关键概念和技术细节。 ### 3. .NET编程 - **3.1 共同编程模型**:介绍了.NET框架提供的统一编程模型,该模型旨在简化开发流程并提高开发效率。 - **3.2 核心特性和语言**:列举了.NET...
- **.NET的垃圾回收机制**:阐述.NET框架下的内存管理机制。 - **3.4 使用命名空间** - **为什么要用命名空间**:解释命名空间的重要性。 - **创建命名空间**:演示如何创建和使用命名空间。 - **分层设计中...
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 ...