首页 文章详情

.NET 8 运行时更新 GC 配置

DotNet NB | 5 2023-10-24 10:10 0 0 0
UniSMS (合一短信)

.NET 8 运行时更新 GC 配置

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


推荐阅读:
.NET静态代码织入——肉夹馍(Rougamo)发布2.0
.NET 8 中的调试增强功能
理解C#中的ValueTask
.NET 使用 ZXing.Net 生成二维码,并识别
使用 Foundatio 轻松构建 .NET 分布式应用
微服务必备,使用 .NET 实现分布式锁

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2023开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter