日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GC.Collect如何影响垃圾回收

發布時間:2025/7/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GC.Collect如何影响垃圾回收 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

根據垃圾回收的算法,對象在內存中是按代的方式存放的,通常情況下,當第0代沾滿分配的空間的時候(比如是256k),GC就會啟動去回收第0代對象,幸存的第0代對象會被放入第1代中去,第1代的對象要等到放滿了才會收集,因此,越是年輕的代越是被頻繁的收集,由于通常情況下GC只收集第0代對象,既保證了可回收較多的內存,又忽略了老一代的對象,從而加快了垃圾回收的速度,提升了性能。

因此當調用gc.collect的時候,相當于強制的對所有代,不管年輕還是老的都執行一次回收。由于垃圾回收器在回收的資源的時候,正在執行托管代碼的線程都會被掛起,具體的細節相當復雜,因為有的線程運行在不安全的點,CLR不能執行垃圾回收,因此CLR會采用線程劫持技術,即通過修改線程棧的方法,來做垃圾回收。這種復雜性使得性能降低。除非確定大量的舊對象死亡,才考慮調用這個方法。

所以,在一般情況下,盡量不要干預垃圾回收器工作,即盡量避免主動調用GC.Collect。

由于垃圾回收是異步的,CLR有一個專用的線程負責垃圾回收,因此,即使調用GC.Collect,也并不是實時的調用了Finalize,因此要保證確實調用了析構方法,可以使用語句GC.WaitForPendingFinalizers()。

下面是一段代碼,通過注釋掉

GC.Collect();

GC.WaitForPendingFinalizers();

語句,看出端倪。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Reflection; namespace ConsoleApplication1 {class Program{static void Main(string[] args){AA aa1 = new AA("1");AA aa2 = new AA("2");AA aa3 = new AA("3");aa1 = null;aa2 = null;//GC.Collect();//GC.WaitForPendingFinalizers();var tmp = aa3;}}public class AA{public string id = "";public AA(string s){id = s;Console.WriteLine("對象AA_" + s + "被創建了");}~AA(){Console.WriteLine(id + " 析構函數被執行了");}} }

當語句被注釋掉的時候,雖然aa1和aa2都設成了null,但是垃圾回收并不是馬上就把它們回收掉。對象可能都被放在第0代上,等進程結束的時候,由垃圾回收器一起回收。所以輸出如下,順序是321

但是當取消注釋后,由于強制垃圾回收時,aa1對象和aa2對象都是null,因此就把它們回收掉了。順序就是213了。

注意,如果aa1和aa2不設成null,那么強制回收時,并不認為這2個對象可以回收。因此還是會等到進程結束的時候才會回收。

總結

以上是生活随笔為你收集整理的GC.Collect如何影响垃圾回收的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。