GCLargeObjectHeapCompactionMode 枚举
属性的值 GCSettings.LargeObjectHeapCompactionMode 是 GCLargeObjectHeapCompactionMode 枚举的成员,该枚举指示下一个完全阻止性垃圾回收是否还 (LOH) 压缩大型对象堆。 默认情况下,LOH 不会压缩。 值 Gclargeobjectheapcompactionmode.compactonce 来压缩指示阻止垃圾回收将压缩 LOH。 垃圾回收后,属性的值将 GCSettings.LargeObjectHeapCompactionMode 恢复为默认值。
即使使用了对象池,仍然可能会在大对象堆里分配对象,随着时间的推移,在里面会存在很多碎片。从.NET 4.5.1 开始,你可以告诉GC在下一次做完整GC时顺便也对LOH做一次压缩。
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
根据LOH的大小,这个压缩过程可能会很慢,甚至会用到好几秒。你最好是在你的程序能够长时间暂停的时候,才让垃圾回收器做一次这样的完整GC。修改该设置值,只会在下一次完整GC时会触发压缩,一旦完成了LOH的压缩,GCSettings.LargeObjectHeapCompactionMode就会被重新设置为GCLargeObjectHeapCompactionMode.Default。
因为这个过程很耗时,我还是建议你减少对LOH的分配或者使用对象池。这样将大大减少压缩的数据。压缩LOH功能只能作为碎片过多,分配的堆太大时的最后手段。
工作模式:工作站、服务器
工作方式:后台、非并发
注意:工作方式 选项只影响第 2 代中的垃圾回收;第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快。
可用不用设置采用默认的工作方式。工作站默认的第2代回收方式是 后台,服务器默认第2代回收方式是非并发的。
.net core 在.csproj 文件添加:
注意:根据.csproj 文件中配置 自动生成对应 【ProjectName】.runtimeconfig.json文件的项。工作站默认interactive(开启并发), 服务器默认Batch(关闭并发)。
工作模式:服务器
工作方式:后台
或者可以在ConsoleApp8.runtimeconfig.json 文件中直接添加代码:
"configProperties": {
"System.GC.Concurrent": true, //true 为后台对应的LatencyMode=interactove,false 为非并发对应的LatencyMode=Batch
"System.GC.Server": false//true 是服务器模式,fasle 是工作台模式
}
代码中查看配置结果:
//查看GC的初始配置:类型、工作方式以及微调工作方式。 类型、工作方式在.json或xml文件中修改。不过可用在程序运行时候微调
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 是否服务器GC
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");//工作方式 System.GC
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 微调工作方式状态
在程序中微调工作方式:
工作站默认interactive(开启并发), 服务器默认Batch(关闭并发)。
using System.Runtime;
//查看GC的初始配置:类型、工作方式以及微调工作方式。 类型、工作方式在.json或xml文件中修改。不过可用在程序运行时候微调
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 是否是服务器GC
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");//工作方式 System.GC
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 微调工作方式状态
Console.WriteLine("GC的工作方式进行微调 将默认的模式修改成Batch");
GCLatencyMode oldGCL=GCSettings.LatencyMode;//获取当前进程 GC 工作方式的微调模式
try
{
GCSettings.LatencyMode = GCLatencyMode.Batch;
//要执行其他代码
}
finally
{
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");// //System.GC
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 工作方式
//修改回去
GCSettings.LatencyMode=oldGCL;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章