【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)
編程控制垃圾收集器
System.GC類型為應用程序提供了直接控制垃圾收集器的一些方法,可以通過GC.MaxGeneration來查詢托管堆支持的最大代齡,目前為2。
通過下面方法執行垃圾收集器
- ?GC.Collect(int);傳遞代齡,傳遞0,收集0代,傳遞1,收集0,1代,傳遞2,收集0.1.2代;
- ?GC.Collect();無參強制對所有代齡的對象執行垃圾收集;
GC.WaitForPendingFinalizers方法會掛起調用線程,直到處理終止化隊列的線程清空了該隊列,并完成每個對象的Finalize方法調用為止。下面代碼:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
上面代碼首先強制執行一次垃圾收集。當第一輪垃圾收集完成后,不需要終止化的那些對象內存將被回收。但是終止化對象的內存還沒有被回收。在第一次Collect調用返回后,一個特殊的、專門用于終止化的線程將采用異步的方式來調用所有終止化對象的Finalize方法。WaitForPendingFinalizers方法將使應用程序處于睡眠狀態,直到所有的Finalize方法調用完成為止。當WaitForPendingFinalizers方法返回,所有的終止化對象將成為真正的可收集垃圾。這時第二次Collect調用將強制執行第二輪垃圾收集,所有終止化對象的內存將在這一輪垃圾收集中完全被回收。
通過編程繼續了解垃圾收集:
namespace?ControlGC
 {
 class?Program
 {
 static?void?Main(?string?[] args)
 {
 Console.WriteLine(?"?Maximum generations:?"?+?GC.MaxGeneration);
 //?在托管堆上創建一個新的GenObj對象
 Object o?=?new?GenObj();
 //?剛剛創建,代齡為0
 Console.WriteLine(?"?Gen?"?+?GC.GetGeneration(o));?//?0
 //?執行垃圾收集器,提高對象代齡
 GC.Collect();
 Console.WriteLine(?"?Gen?"?+?GC.GetGeneration(o));?//?1
 GC.Collect();
 Console.WriteLine(?"?Gen?"?+?GC.GetGeneration(o));?//?2
 GC.Collect();
 Console.WriteLine(?"?Gen?"?+?GC.GetGeneration(o));?//?2(最大值)
 o?=?null?;?//?銷毀對象,此時對象的代齡為2
 Console.WriteLine(?"?Collect Gen 0?"?);
 GC.Collect(?0?);?//?收集第0代對象,其實沒有0代對象
 GC.WaitForFullGCApproach();?//?不會調用Finalize
 Console.WriteLine(?"?Collect Gen 0?"?);
 GC.Collect(?1?);?//?收集第0代對象,其實沒有1代對象
 GC.WaitForFullGCApproach();?//?不會調用Finalize
 Console.WriteLine(?"?Collect Gen 0?"?);
 GC.Collect(?2?);?//?收集第2代對象,對象真正被收集
 GC.WaitForFullGCApproach();?//?調用Finalize
 }
 }
 class?GenObj
 {
 ~?GenObj()
 {
 Console.WriteLine(?"?In Finalize method?"?);
 }
 }
 }
執行結果
深刻的了解代齡
?大尺寸對象
任何占用內存大于等于85000字節的對象都被認為是大尺寸對象(large object)。大尺寸對象是從一個特殊的大尺寸對象托管堆中分配的。該托管堆中對象的終止化和內存釋放行為與前面描述的小尺寸對象相同。但是大尺寸對象不會被壓縮,因為在托管堆中移動大尺寸對象會浪費CPU比較多的時間。
大尺寸對象總是被認為是2代的。
總結
以上是生活随笔為你收集整理的【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 九省发布取缔P2P网贷业务,p2p的风
- 下一篇: 2019我国人均GDP突破1万美元,20
