【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:指定垃圾收集是强制的(Default或Forced指回收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知道这个信息后会调整它的垃圾回收策略,当压力变大时,他就强制执行垃圾回收。