【C# .Net GC】 HandleCollector類
阿新 • • 發佈:2022-03-01
GC為本機資源提供的其他功能
本機資源有時會消耗大量記憶體,但用於包裝它的託管物件只佔用很少的記憶體。一個典型的例子就是點陣圖。一個位圖可能佔用幾兆位元組的本機記憶體,託管物件卻極小,只包含一個HBITMAP(一個4或8位元組的值)。如果程序操作許多點陣圖,程序的記憶體消耗將以一個恐怖的速度增長。為了修正這個問題,GC類提供了以下兩個靜態方法:
public static void AddMemoryPressure(Int64 bytesAllocated);
public static void RemoveMemoryPressure(Int64 bytesAllocated);
如果一個類要包裝可能很大的本機資源,就應該使用這些方法提示垃圾回收器實際需要消耗多少記憶體。垃圾回收器內部會監視記憶體壓力,壓力變大時,就強制執行垃圾回收。
有的本機資源的數量是固定的。例如,Windows以前就限制只能建立5個裝置上下文。應用程式能開啟的檔案數量也必須有限制。如果這些本機資源的數量有限,那麼一旦試圖使用超過允許數量的資源,通常會導致丟擲異常。為了解決這個問題,名稱空間System.Runtime.InteropServices提供了HandleCollector類。
如果一個類要包裝數量有限制的本機資源,就應該使用該類的例項來提示垃圾回收器實際要使用資源的多少個例項。該類的物件會在內部監視這個計數,計數太大就強制垃圾回收。