【C# .Net GC】強制垃圾回收 和System GC


屬性

GC.MaxGeneration:獲取系統當前支持的最大代數。

方法

GC.GetTotalMemory(bool forceFullCollection) 方法
  true表示該方法先做垃圾收集操作,之后才計算出受控代碼分配的字節數。false表示不做垃圾收集,直接計算出受控代碼分配的字節數。

GC.Collect

垃圾回收是基於歷史經驗了,當發生非重復性事件的時候,垃圾自動回收就變的不准確,這時候可用采用手動調用GC.Collect方法清除垃圾。例如在用戶保存一個數據之后強制執行一次GC.Collect方法。

GC.Collect();  //強制對所有代進行即時垃圾回收。
Collect(Int32) 強制對 0 代到指定代進行即時垃圾回收。
Collect(Int32, GCCollectionMode) 強制在 GCCollectionMode 值所指定的時間對 0 代到指定代進行垃圾回收。
Collect(Int32, GCCollectionMode, Boolean) 在由 GCCollectionMode 值指定的時間,強制對 0 代到指定代進行垃圾回收,另有數值指定回收是否應該為阻礙性。
Collect(Int32, GCCollectionMode, Boolean, Boolean) 在由 GCCollectionMode 值指定的時間,強制對 0 代到指定代進行垃圾回收,另有數值指定回收應該為阻礙性還是壓縮性。

GCCollectionMode:指定垃圾收集是強制的(DefaultForced指回收0~指定的代)還是optimized優化(指能釋放大內存和減少碎片化才執行優化)。

using System.Runtime;
//查看GC的類型,以及工作方式。該類在using System.Runtime;命名空間 在.json或xml文件中修改
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 釋放是服務器GC
Console.WriteLine($"IsServerGC:{GCSettings.LatencyMode}");// 工作方式

FGClass fG = new FGClass();
fG.MakeGarbage();
Console.WriteLine($"GetGeneration:{GC.GetGeneration(fG)}");// 獲取當前垃圾對象所在的代

//檢索當前認為要分配的字節數。參數指示此方法是否可以在返回之前等待一個短時間間隔,以允許系統收集垃圾和結束對象。
Console.WriteLine($"GetTotalMemory:{GC.GetTotalMemory(false) / 1024}MB");//  
Console.WriteLine($"GetGeneration:{GC.GetGeneration(fG)}");//  

GC.Collect(0);//回收第0代
Console.WriteLine($"GetTotalMemory:{GC.GetTotalMemory(false) / 1024}MB");//  
Console.WriteLine($"GetGeneration:{GC.GetGeneration(fG)}");//  

GC.Collect(2);//回收0~2代
Console.WriteLine($"GetTotalMemory:{GC.GetTotalMemory(false) / 1024}MB");//  
Console.WriteLine($"GetGeneration:{GC.GetGeneration(fG)}");//  

Console.Read();
public class FGClass
{
    Version vt;
    public void MakeGarbage()
    {

        for (int i = 0; i < 100; i++)
        {
            vt = new Version();

        }

    }

}

 GC.CollectionCount()返回自啟動進程以來已經對指定代進行的垃圾回收次數。

以下這些方法是大對象回收時候用到:

CancelFullGCNotification
RegisterForFullGCNotification
WaitForFullGCApproach
WaitForFullGCComplete

AddMemoryPressure和RemoveMemoryPressure

 這兩個方法主要用於本地資源,比如一個位圖占用了50M本地內存,但是托管對象只包含一個HBitMap(4字節或8字節)。但CRL並不知道這個內存壓力,它可能允許你分配數百個位圖,因為它們占用的托管內存太少了。這兩個方法的目的就是要告訴GC它實際的本地資源用了多少內存量,GC知道這個信息后會調整它的垃圾回收策略,當壓力變大時,他就強制執行垃圾回收。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM