目录
Intro
为了更好的云原生的支持,.NET 8 支持了运行时更新 GC 的配置,我们可以在运行时修改 GC 的配置了,在之前的版本中需要通过反射来调用,在 RC2 版本中直接新增了一个 public 方法可以直接调用,无需再通过反射调用了
Sample
public static class GCSample
{
public static void MainTest()
{
PrintMemoryInfo();
ulong memoryInBytes = 50 * 1024 * 1024;
SetLimitAndRefresh(memoryInBytes);
memoryInBytes = 60 * 1024 * 1024;
SetLimitAndRefresh(memoryInBytes);
// System.InvalidOperationException: RefreshMemoryLimit failed with too low hard limit.
try
{
memoryInBytes = 1 * 1024;
SetLimitAndRefresh(memoryInBytes);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
private static void SetLimitAndRefresh(ulong limit)
{
AppContext.SetData("GCHeapHardLimit", limit);
GC.RefreshMemoryLimit();
PrintMemoryInfo();
}
private static void PrintMemoryInfo()
{
var memoryInfo = GC.GetGCMemoryInfo();
Console.WriteLine($"{nameof(memoryInfo.TotalAvailableMemoryBytes)}: {memoryInfo.TotalAvailableMemoryBytes/1024/1024}*1024*1024");
}
}
可以使用 dotnet-exec
直接运行或者将 MainTest()
改成 Main()
即可运行
输出结果如下:
可以看到修改前后的 memory 是会有变化的,修改之后需要调用 Refresh 的方法才会生效,如果设置的 memory limit 太低的话会直接报错,如果设置的 memory limit 不合法的也会报错
除了 GCHeapHardLimit
,下面这些配置也是支持的,感兴趣的话可以自己试一下
GCHeapHardLimit
GCHeapHardLimitPercent
GCHeapHardLimitSOH
GCHeapHardLimitLOH
GCHeapHardLimitPOH
GCHeapHardLimitSOHPercent
GCHeapHardLimitLOHPercent
GCHeapHardLimitPOHPercent
References
-
https://github.com/dotnet/runtime/issues/70601
-
https://learn.microsoft.com/en-us/dotnet/api/System.GC.RefreshMemoryLimit?view=net-8.0
-
https://github.com/WeihanLi/SamplesInPractice/blob/master/net8sample/Net8Sample/GCSample.cs