【C# .Net GC】GC初始化设置 和GcSetting

相关的类

GcSetting 类

GCLargeObjectHeapCompactionMode 枚举

GCLargeObjectHeapCompactionMode 枚举

属性的值 GCSettings.LargeObjectHeapCompactionModeGCLargeObjectHeapCompactionMode 枚举的成员,该枚举指示下一个完全阻止性垃圾回收是否还 (LOH) 压缩大型对象堆。 默认情况下,LOH 不会压缩。 值 Gclargeobjectheapcompactionmode.compactonce 来压缩指示阻止垃圾回收将压缩 LOH。 垃圾回收后,属性的值将 GCSettings.LargeObjectHeapCompactionMode 恢复为默认值。

GcSetting 类

按需压缩大对象堆

即使使用了对象池,仍然可能会在大对象堆里分配对象,随着时间的推移,在里面会存在很多碎片。从.NET 4.5.1 开始,你可以告诉GC在下一次做完整GC时顺便也对LOH做一次压缩。

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;

根据LOH的大小,这个压缩过程可能会很慢,甚至会用到好几秒。你最好是在你的程序能够长时间暂停的时候,才让垃圾回收器做一次这样的完整GC。修改该设置值,只会在下一次完整GC时会触发压缩,一旦完成了LOH的压缩,GCSettings.LargeObjectHeapCompactionMode就会被重新设置为GCLargeObjectHeapCompactionMode.Default。
因为这个过程很耗时,我还是建议你减少对LOH的分配或者使用对象池。这样将大大减少压缩的数据。压缩LOH功能只能作为碎片过多,分配的堆太大时的最后手段。

GC初始化设置

工作模式:工作站、服务器

工作方式:后台、非并发

注意:工作方式 选项只影响第 2 代中的垃圾回收;第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快。

可用不用设置采用默认的工作方式。工作站默认的第2代回收方式是  后台,服务器默认第2代回收方式是非并发的。

.net core 在.csproj 文件添加:

注意:根据.csproj 文件中配置 自动生成对应 【ProjectName】.runtimeconfig.json文件的项。工作站默认interactive(开启并发), 服务器默认Batch(关闭并发)。

工作模式:服务器

<PropertyGroup>
  <ServerGarbageCollection>true</ServerGarbageCollection>
//true 是服务器模式,fasle 是工作台模式
</PropertyGroup>

 工作方式:后台

<PropertyGroup>
    <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
 //true 为后台对应的LatencyMode=interactove,false 为非并发对应的LatencyMode=Batch
 </PropertyGroup>

或者可以在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;
}

 

posted @ 2022-02-25 16:30  小林野夫  阅读(1262)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/