.NET4.0中的新特性系列课程(7):垃圾回收机制入门GC垃圾回收机制入门——GC楼炉群金林楼炉群金林SDETSDET内容内容1.GC介绍2GC中的代2.GC中的代3.GC工作流程3GC工作流程4.GC在程序中的应用资源资源:内存块,屏幕区域、文件、网络连接,数据源…资源内存块,屏幕区域文件网络接数据源对资源操作对资源操作1.为对应的资源分配内存2.初始化内存3.使用资源4.清理资源5.释放内存资源管理的方式手动管理:C++,C手动管计数管理:String,COM自动管理自动管理:Java,.NET为什么需要GC1.忘记去释放内存?2.访问已经释放的内存?后果很严重啊,内存泄露、数据内容一团糟,而且大部分时候,程序的行为会变得不可预测,还有AccessViolation!!!!.NET的解决方案决法自会帮你放问题1解决方法:GC自动会帮你释放问题2自然就消失了内容内容1.GC介绍2GC中的代2.GC中的代3.GC工作流程3GC工作流程4.GC在程序中的应用GC中的代GC中的代代的原提高性能代(Generation)引入的原因:提高性能(Performance),以避免收集整个Heap(),免收集个p垃圾收集器将对象分为三代Gti1大小为512KB(?)动态调整Generation1:大小为512KB(?),动态调整Generation2:大小为2MB(?),动态调整Generation3:大小为10MB(?),动态调整Level200GC中的代GC中的代代的内容•代里面的内容:•G0:小对象(Size85,000)G0小对象(Se85,000)•G1:在GC中幸存下来的G0对象•G2:大对象(Size85000);在GC中幸存下来•G2:大对象(Size85,000);在GC中幸存下来的G1对象代收集规则当个代被收集以后在这•代收集规则:当一个代N被收集以后,在这个代里的幸存下来的对象会被标记为N+1代的对象Level200Level200什么时候发生GC?什么时候发生GC?你的象算大当你分配新的对象,GN预算大小已经达到主动调用GCCollect()主动调用GC.Collect()其他特殊情况Level200GC代收集GC代收集ABCDEGeneration0发生垃圾收集ACDGeneration1Generation0Level200DEMOGC中的代GC中的代内容内容1.GC介绍2GC中的代2.GC中的代3.GC工作流程3GC工作流程4.GC在程序中的应用GC是如何工作的•标记(Mark)标记•计划(Plan)•清理(Sweep)(标记所有liveObjects)计算•引用更新(Relocate)•压缩(Compact)计算(计算是否采取压缩)压缩?Sweep(清除)压缩(移动Objects到新位(移动Objects到新位置)标记目标:找出所有引用不为0(live)的实例方法找到所有的GC的根结点(GCRoot)将他们放到队列里然后依次方法:找到所有的GC的根结点(GCRoot),将他们放到队列里,然后依次递归地遍历所有的根结点以及引用的所有子节点和子子节点,将所有被遍历到的结点标记成live。弱引用不会被考虑在内。例如:AB(ason=b)例如:A-B(a.son=b)B-CC-DD-BD-BGCRoot:全局变量全局变量静态变量栈上的所有局部变量(JIT)栈上传入的参数变量栈传数变寄存器中的变量为什么C++时代没有GC?为什么C++时代没有GC?标记标记•示例托管堆:ABCDEFG托管堆:ABCDEFGHIRootsLevel200Level200计划&清理计划计目标:判断是否需要压缩方法:遍历当前所有的generation上所有的标记(Live),根据特定算法作出决策决策清理目标:回收所有的free空间方法:遍历当前所有的generation上所有的标记(LiveorDead),把所有处在Live实例中间的内存块加入到可用内存链表中去在e实例中间的内存块加入到可用内存链表中去引用更新&压缩引用更新引用更新目标:将所有引用的地址进行更新方法:计算出压缩后每个实例对应的新地址,找到所有的GC的根结点(GC缩实(Root),将他们放到队列里,然后依次递归地遍历所有的根结点以及引用的所有子节点和子子节点,将所有被遍历到的结点中引用的地址进行更新,包括弱引用。压缩目标:减少内存碎片方法:根据计算出来的新地址,把实例移动到相应的位置。DEMOGC工作流程GC工作流程内容内容1.GC介绍2GC中的代2.GC中的代3.GC工作流程3GC工作流程4.GC在程序中的应用如何更好的应用GCGC.Collect()GC.WaitForPendingFinalizers()GCKAliGC.KeepAlive尽量不要new很大的object不要频繁的ne生命周期很短object这样会导不要频繁的new生命周期很短object,这样会导致很多内存碎片导致频繁的compactDEMO如何更好的应用GC如何更好的应用GCQuestion&Answer如需提出问题,请在此区域输入文字,并单击“问题和解答”右上方的“提问”按钮即可。您也可以选择在微软中文技术论坛上寻求帮助,MSDN中文网络广播的讲师们会定期在论坛上为大家解答与课程相关的技术问题。://forumsmicrosoftcom/china://forums.microsoft.com/china