登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP网盘
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Dynamic adaptation to application sizes (DATAS) GC ...
Dynamic adaptation to application sizes (DATAS) GC 策略
[ 复制链接 ]
襁壮鸢
2025-6-2 22:44:54
现在大家的 .NET 程序基本都部署在如 K8S 这种容器化场景下。出于节约资源的考虑,往往我们还会限制每个实例占用的资源。不知道大家发现没有,在一些高并发的场景下,我们的程序会占用非常多的内存,内存迟迟不释放,在某些极端情况下甚至会发生 OOM 。如果你搜索这个问题,大概率会找到一个答案,那就是在一些资源有限的环境请把 GC 改成 workstation 模式。更改为 workstation 模式后,内存占用高的情况确实有所好转,但是同时也会影响服务的吞吐量。
到了 .NET8 其实我们还有另外一个 GC 的策略可以选择,那就是 DATAS - Dynamic adaptation to application sizes 。它可以帮我们在内存占用跟吞吐量之间找到一个平衡。
首先让我们回顾一下什么是 Workstation 跟 Server GC。
Workstation GC
工作站垃圾回收(Workstation GC)
定位:专为客户端应用程序设计
默认场景:
独立应用程序的默认GC类型
托管应用(如ASP.NET托管的应用)由宿主决定默认类型
运行模式:
并发模式(Concurrent GC):允许托管线程在垃圾回收期间继续运行(.NET Framework 4及后续版本中由后台GC取代)
非并发模式:执行垃圾回收时会暂停所有托管线程
Server GC
服务器垃圾回收(Server GC)
核心优势:为需要高吞吐量和高可扩展性的服务端应用程序优化
典型特征:
为每个逻辑CPU创建独立GC堆
采用更激进的堆扩展策略
适用于多核服务器环境
DATAS
了解了 Workstation 与 Server GC 的概念后,让我们看看 DATAS 是怎么工作的。
动态适应应用规模的垃圾回收机制(DATAS GC)旨在根据应用程序的内存需求进行自适应调整。这意味着应用程序堆大小应与长期存活数据量大致成正比。如果在不同配置的机器上运行相同任务,堆大小应保持相同或相近;当工作负载减轻或加重时,堆大小会相应调整。
与之相比,服务器GC模式(Server GC)以提升吞吐量为目标,假设当前进程是机器上的主导进程。其触发下次GC前的分配量基于吞吐量而非应用规模。只要内存可用,它会激进地扩展堆空间,导致相同进程在不同硬件配置的机器上运行时堆大小差异显著(例如在核心数和内存更多的机器上堆会大幅增长)。即使工作负载大幅减轻,服务器GC也不一定会主动缩减堆空间。
DATAS GC尤其适合突发型工作负载,能根据负载需求(特别是需求下降时)调整堆大小。这对内存受限环境至关重要——当某些进程负载降低时可容纳更多进程,同时也利于容量规划。该功能在.NET 8中作为可选特性引入,并在.NET 9默认启用。
实现原理
为实现应用规模自适应且保持性能,DATAS GC采取以下策略:
基于长期存活数据量设定触发下次GC前的最大分配量,从而约束堆大小
基于吞吐量动态调整实际允许的分配量
弹性调整堆数量:初始仅使用单堆(多线程分配时可能引发等待,影响吞吐量),但会根据需求增减堆数量。这种混合模式兼具工作站GC(单堆)和服务器GC(按核心数分配堆)的优势
执行完全压缩式GC以防止内存碎片过高,进一步帮助控制堆大小
关注我的公众号一起玩转技术
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Dynamic
adaptation
to
application
sizes
相关帖子
RAGflow搭建text-to-sql的AI研发助手
万字长文详解Text-to-SQL
Three Locks To Rule Them All(三把锁统治一切)
Fotify扫描问题Dynamic Code Evaluation:Code Injection
How to implement a software layer
2.application的启动方式和生命周期
dynamic-datasource detect druid publicKey,It is high
[USACO16JAN] Subsequences Summing to Sevens S 解析
【Container App】创建Container App后发现Application URL不完整
Web server failed to start. Port 8080 was already in use. 端口被占用
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
RAGflow搭建text-to-sql的AI研发助手
0
827
扈季雅
2025-06-02
业界
万字长文详解Text-to-SQL
0
445
旁拮猾
2025-06-03
代码
Three Locks To Rule Them All(三把锁统治一切)
0
126
仲秀娟
2025-06-05
代码
Fotify扫描问题Dynamic Code Evaluation:Code Injection
0
261
杆树
2025-06-05
业界
How to implement a software layer
0
857
映各
2025-06-06
业界
2.application的启动方式和生命周期
0
450
肿抢
2025-06-08
业界
dynamic-datasource detect druid publicKey,It is high
0
352
费卿月
2025-07-10
科技
[USACO16JAN] Subsequences Summing to Sevens S 解析
0
666
赘暨逢
2025-07-12
业界
【Container App】创建Container App后发现Application URL不完整
0
356
注思
2025-07-18
业界
Web server failed to start. Port 8080 was already in use. 端口被占用
0
556
粹脍誊
2025-09-01
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
襁壮鸢
2025-6-2 22:44:54
关注
0
粉丝关注
17
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
黎瑞芝
9990
杭环
9988
4
凶契帽
9988
5
氛疵
9988
6
虽裘侪
9986
7
猷咎
9986
8
接快背
9986
9
里豳朝
9986
10
肿圬后
9986
查看更多