1、托管代码Managed Code
托管代码是编译器创建,被编译成中间语言(IL),IL被保存在程序集(描述代码的类、方法它和属性的元数据文件)中。
托管代码运行在CLR中;
托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;
托管类型是可以被垃圾回收器所回收的。他们必须要用关键字new来创建;
.Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。
2、非托管代码Unmanaged Code
非托管代码依赖与平台和语言,需要自己提供安全检测、垃圾回收等操作;
.net程序在进行内存中分配出堆栈(Stack)、托管堆、非托管堆。
1、堆栈上
- 分配的是所有的值类型对象、引用类型对象的引用
- 根据对象的生存周期来依次分配和释放
- 在.net中,始终存储了一个特殊的指针指向堆栈的尾部,这样一个堆栈内存的分配就直接从这个指针指向的内存位置开始向下分配,效率很高
2、托管堆
- 分配的是.net所有的引用类型对象
- 托管堆连续分配内存
- 受.net的垃圾收集机制管理,效率比堆栈低得多
3、非托管堆
- 非托管资源被分配到非托管堆上;
- 非托管的堆需要程序员手动分配、手动释放;
- 不受.net的垃圾回收和内存管理制度管理;