<div>过程</div>
GC开始时,暂停所有线程
遍历托管堆中所有的对象,并将同步索引块中的一位设为0
<div>检查所有的活动根,查看他们引用那些对象,并将这些对象同步索引块中的一位设为1</div>
<div>如果根包含null,及未引用任何对象,则忽略这个根,继续检查下一个,直到检查完毕</div>
对标记为0的对象(不可达)进行垃圾回收,标记为1的对象(可达)不回收
<div>进入GC压缩阶段,对标记为1的对象进行压缩,使他们占用连续的内存空间</div>
<div>CLR对每个根减去所引用对象在内存中偏移的字节数,以保证每个根还是引用之前的对象</div>
<div>将NextObjPtr指向最后一个幸存对象之后的位置</div>
<div>如果内存已满,则在使用new开辟新的内存空间时会引发OutOfMemoryException</div>
优点
解决循环引用问题
<div>GC压缩后,使对象仍占用连续的内存空间,解决堆空间的内存碎片化问题,减小应用程序工作集,提高性能</div>
<div>开发中注意事项</div>
尽量避免使用静态字段
<div>原因</div>
静态字段引用会一直存在,直到用于加载类型的AppDomain被卸载为止
当静态字段引用一个集合对象,并不断的向集合对象中加入数据,则会引发内存溢出