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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】.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内存管理\垃圾收集(七)的全部內容,希望文章能夠幫你解決所遇到的問題。

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