Spiga

分类为扩展阅读的文章

CLR核心机制

2016-10-01 14:56:38

摘要:.NET CLR核心机制学习笔记 一、堆(Heap)与栈(Stack)的区别 1. 基本概念 栈(Stack):像叠盘子,后进先出。线程创建时由系统自动分配,存储值类型(如int、float、struct) 堆(Heap):像大仓库,需要时申请空间。存储引用类型(如class对象),由GC管理 2. 核心差异 特性 栈 堆 存储内容 值类型 引用类型 管理方式 自动维护(自动清理) GC垃圾回收 空间大小 较小(默认1MB) 较大(GB级) 访问速度 快(直接访问) 稍慢(通过指针) 二、内存分配实战 1. 值类型分配 int num = 42; // 直接分配在栈上 2. 引用类型分配 class Person {} var p = new Person(); // 实际对象在堆,p是栈上的引用 3. 混合情况 值类型中的引用类型:值类型在栈,内部的引用类型数据在堆 引用类型中的值类型:随对象整体存放在堆中 三、GC垃圾回收机制 1. 为什么要GC? 内存是有上限的,不可能无止境的分配空间,因此就产生了GC(Garbage Collector)的需求 . 1. 提高了软件开发的抽象度; 2. 程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题; 3. 可以使模块的接口更加的清晰,减小模块间的偶合; 4. 大大减少了内存人为管理不当所带来的Bug; 5. 使内存管理更加高效。 总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。 什么样的对象需要垃圾回收 托管资源 存在堆里(含值类型+引用类型) 托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等,大部分对象都是托管资源。 非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源,需要调用Dispose方法。 2. 回收算法(Mark-Compact) 标记阶段:从根对象出发,标记所有可达对象 清除阶段:回收未标记对象的内存 压缩阶段:整理内存碎片(像整理衣柜) 阶段1: Mark-Sweep 标记清除阶段,先假设heap中所有对象都可以回收,然后找出不能回收的对象,给这些对象打上标…… 阅读全文