CH19 自动内存管理 .net复习课
2009-03-02 20:35
197 查看
19.1 垃圾收集平台基本原理解析
- 访问资源需要的几个步骤
- newobj为实例飞配一定的内存空间(在托管堆上)
- 初始上一步所得的内存
-使用资源
- 销毁资源状态
- 释放内存
- CLR预留一块连续的地址空间:托管堆。在其上维护一个NextObjPtr指针。
- newObj指令会让CLR做下面几件事情
- 技术所有字段所需要的空间
- 再加上附加字段(方法指针表和SyncBlockIndex,各占32位,64位中占64位)
- 检查是否满足。不满足提交物理内存,满足则让newObj返回引用类型的指针,再更新nextObjPtr指针。
- 对于以上操作的方式,我们是假设内存空间是无限的。这个是不可能滴!托管堆中的内存空间会用完。我们需要垃圾收集来释放掉不可达的内存空间。
19.2 垃圾收集算法
- 每个应用程序都有根,根就是一个个存储位置。
- JIT编译器会创建一张内部表,其中包括了根和内存地址段之间的映射关系。
- 垃圾收集器根据这张表来生成一个可达对象的图,若一个对象引用到了另一个对象,则添加一条路径(图中不允许出现回路)
- 释放掉内存中的不可达对象
- 压缩内存
- 再更新根和内存段之间的对应关系
*注意
- 当一个根被标注为不可达时,CLR并不保证它能够存活到方法调用结束,除非在Debug状态,或者运用了System.Diagnostics.Debuggable特性
- 访问资源需要的几个步骤
- newobj为实例飞配一定的内存空间(在托管堆上)
- 初始上一步所得的内存
-使用资源
- 销毁资源状态
- 释放内存
- CLR预留一块连续的地址空间:托管堆。在其上维护一个NextObjPtr指针。
- newObj指令会让CLR做下面几件事情
- 技术所有字段所需要的空间
- 再加上附加字段(方法指针表和SyncBlockIndex,各占32位,64位中占64位)
- 检查是否满足。不满足提交物理内存,满足则让newObj返回引用类型的指针,再更新nextObjPtr指针。
- 对于以上操作的方式,我们是假设内存空间是无限的。这个是不可能滴!托管堆中的内存空间会用完。我们需要垃圾收集来释放掉不可达的内存空间。
19.2 垃圾收集算法
- 每个应用程序都有根,根就是一个个存储位置。
- JIT编译器会创建一张内部表,其中包括了根和内存地址段之间的映射关系。
- 垃圾收集器根据这张表来生成一个可达对象的图,若一个对象引用到了另一个对象,则添加一条路径(图中不允许出现回路)
- 释放掉内存中的不可达对象
- 压缩内存
- 再更新根和内存段之间的对应关系
*注意
- 当一个根被标注为不可达时,CLR并不保证它能够存活到方法调用结束,除非在Debug状态,或者运用了System.Diagnostics.Debuggable特性
相关文章推荐
- .net 垃圾回收学习【.net 框架程序设计】[CH19: 自动内存管理]
- Oracle 自动内存管理 SGA、PGA 详解
- 2016书单总结--深入理解Java虚拟机-JVM高级特性与最佳实践--自动内存管理
- Objective C----手动管理内存和自动管理内存
- 自动内存管理机制_运行时数据区域
- c++ auto_str自动管理new 动态申请的内存
- oracle11G可以自动管理内存
- c# 自动内存管理
- iOS ARC自动管理内存的坑
- 根据Facebook内存的管理使用,浅谈在iOS上自动检测内存泄漏问题
- C# 语言规范--1.4 自动内存管理
- .NET Framework 自动内存管理机制深入剖析 (C#分析篇)[转]
- Java自动内存管理机制(三) 对象、引用
- Oracle 11g 的 自动内存管理
- 第一篇:自动内存管理机制
- JVM 自动内存管理:对象判定和回收算法
- C# 语言规范--1.4 自动内存管理
- ios 自动内存管理 ARC
- iOS5的strong,weak,unsafe_unretained ARC自动管理内存
- Oracle 内存自动管理