闂傚倸鍊峰ù鍥Υ閳ь剟鏌涚€n偅宕岄柡宀€鍠栭、娑樷堪閸愮偓姣夋俊鐐€戦崕濠氬箯閿燂拷 (0) +1 闂傚倷娴囧畷鍨叏瀹ュ拋鍚嬮柛鈩冾殢娴硷拷 (0) +1 闂傚倸鍊搁崐鎼併偑鐎涙ḿ顩查柣鎴f缁狀垶鏌ㄩ悤鍌涘 (0) +1
闂傚倸鍊峰ù鍥Υ閳ь剟鏌涚€n偅宕岄柡宀€鍠栭、娑樷堪閸愮偓姣夋俊鐐€戦崕鏌ュ垂閸ф钃熼柣鏃囥€€閸嬫挸鈽夊▍顓т簼閹便劑宕惰閺€鑺ャ亜閺囩偞顥為悗姘炬嫹闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏缂傚倷璁查弲鐘诲蓟閻旂⒈鏁嶆繝濠傚枤閺嗩厼顪冮妶鍐ㄥ姷闁瑰嚖鎷�>>

正在阅读:.NET中的垃圾回收(上).NET中的垃圾回收(上)

2004-02-14 09:34 出处:PConline 作者:cloud/CSDN 责任编辑:linjixiong

   比如:

  一个应用程序中所有全局和静态对象指针。

  一个线程堆栈中所有局部变量/参数对象指针。

  托管堆中所有CPU登记的对象指针。

   FReachable队列中的对象指针。

  活动根的表由JIT编译器和CLR维护,并且对于垃圾回收器的算法是访问。

  实现
  .NET中的垃圾回收是用跟踪回收实现的,确切的说CLR实现了标记(Mark)/整理(Copact)回收器。

  这个方法有以下两个阶段组成:

   阶段I:标记(Mark)

  找到可以被收回的内存。

   当GC开始运行时,它假设堆中的所有对象都是垃圾。换句话说,它假设应用程序的根没有指向堆中的的任何对象。

  阶段I中包含下列步骤:

  1.  GC识别存活对象的引用或应用程序根。

  2.  从根开始遍历,建一张可以从根遍历的所有对象的图。

  3.  如果GC准备尝试添加一个已经在图中的对象,它就停止这条路径的遍历。这样做有两个目的,第一个是极大的优化性能,因为它不会遍历一套对象一次以上。第二是防止当有对象的循环连接列表时而发生死循环,因此循环被有效的控制了。

   一旦所有的根都被检查完后,垃圾回收器的图中包含了所有可以从应用程序根遍历到的对象。任何不再图中的对象都不能被应用程序访问到,也就是所谓的垃圾。

   阶段II:整理(Compact)
  把所有存活的对象移到堆的末端,空出堆顶端的空间。

   阶段II包含下列步骤:

  1.  现在GC线性地遍历堆,寻找邻近的垃圾对象块(现在被认为是空闲空间)。

  2.  然后GC往下移动内存中的非垃圾对象,去掉堆中的所有空隙。

  3.  移动内存中的对象导致对象指针失效。因此GC需要修改应用程序的根使对象的指针指向新的位置。

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倸鍊风粈浣虹礊婵犲倴缂氱憸鏃堛€侀弽顓炲耿婵$偟绮弫鐘绘⒑闁偛鑻晶鎾煙椤旀娼愰柟宄版嚇瀹曘劍绻濋崒娆愭▕濠电姷顣藉Σ鍛村磻閹捐绠柨鐕傛嫹闂傚倸鍊烽悞锕傚箖閸洖纾块柟鎯版绾剧粯绻涢幋娆忕仼闁哄嫨鍎甸幃姗€鎮欓弶鍨彑婵炲瓨绮嶇划鎾诲蓟濞戙埄鏁冮柨婵嗘椤︺儵姊洪崨濠冾棖闁瑰嚖鎷�