.Net内存管理和释放机制
1).每个进程都有其自己单独的虚拟地址空间。 同一台计算机上的所有进程共享相同的物理内存和页文件,另外物理内存压力(即物理内存的需求)较低的情况下也会使用页文件).
2)内存虚拟地址的三种状态:Free,保留,已提交(物理内存).
3)CLR 负责提取托管代码、将其编译成机器代码,然后执行它。 CLR也负责自动内存管理、安全边界、类型安全,等等.
4)非托管代码的内存管理:由操作系统 (OS) 载入内存,然后启动的二进制代码
5)初始化新进程时,运行时会为进程保留一个连续的地址空间区域,这个就是托管堆.
6).net新对象默认放到0级托管堆上.
7)GC在什么时候触发回收?
7.1)应用程序在第 0 级托管堆已满时尝试新建对象,GC会执行回收0级托管,同时把未被回收的对象升级到G1托管堆中存储.
7.2)系统具有低的物理内存。 这是通过 OS 的内存不足通知或主机指示的内存不足检测出来.
7.3)调用 GC.Collect 方法(除非测试等目的,否则不建议)
8)GC什么时候回收G1,G2托管堆的内存空间?
GC的优化引擎会决定是否需要检查G1,G2中的对象。 例如:如果第 0 级托管堆的回收没有回收足够的内存,不能使应用程序成功创建新对象,GC就会先执行第 1 级托管堆的回收,再执行第 2 级托管堆的回收.
注:回收一代时,同时也会回收它前面的所有代
9)常见非托管的资源类型:包装操作系统资源的对象,例如,文件句柄、窗口句柄或网络连接.