Dynamic adaptation to application sizes (DATAS) GC 策略
现在大家的 .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 (DATAS) GC 策略的更多相关文章
- ZGC gc策略及回收过程-源码分析
源码文件:/src/hotspot/share/gc/z/zDirector.cpp 一.回收策略 main入口函数: void ZDirector::run_service() { // Main ...
- HBase的几种调优(GC策略,flush,compact,split)
一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 ...
- 【转】JVM 分代GC策略分析
我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我们应该知道,垃圾回收主要是针对 ...
- 大战Java虚拟机【2】—— GC策略
前言 前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象.那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定 ...
- 082 HBase的几种调优(GC策略,flush,compact,split)
一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 ...
- JVM的GC策略
1 前言 GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让Java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理. 说一句题外话,我 ...
- JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑
JavaScript 内存管理 & 垃圾回收机制 标记清除 js 中最常用的垃圾回收方式就是标记清除.当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”.从逻辑上讲 ...
- Java垃圾回收机制(GC策略)
Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...
- websphere gc策略调整
根据应用服务器处理的特性,适配不同的gc策略,验证程序最适合程序的gc策略: server.xml路径: xmlcells/PBOCCell/nodes/PBOCNode01/servers/PBOC ...
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
随机推荐
- 本地一键运行大模型神器Ollama + DeepSeek R1尝鲜指南
本地一键运行大模型神器Ollama + DeepSeek R1尝鲜指南 作为AI领域的弄潮儿,你是否苦恼于云端大模型API的高昂成本?想在本机零门槛体验顶尖开源模型?这篇保姆级教程将带你解锁「Olla ...
- Blazor开发框架KnownPro-创建新项目
摘要 本文主要介绍如何使用Known专业版创建新项目. 操作步骤 登录Known专业版VIP会员管理系统. 进入首页,点击[创建项目]按钮. 弹出创建项目对话框,填写项目ID.名称和数据库类型(默认S ...
- 用python做时间序列预测二:时间序列的一般数据格式和可视化
本文将介绍如何通过python来读取.展现时间序列数据. 读取 时间序列数据一般用cvs等电子表格的形式存储,这里以cvs为例: from dateutil.parser import parse f ...
- 分享一个 Windows 下的透明锁屏工具【开源】
透明锁屏 担心展示内容时被误操作打断? 害怕离开后忘记锁屏导致隐私泄露? 厌倦了千篇一律的系统锁屏界面? 透明锁屏 了解一下. 功能特点 告别误操作:锁屏状态下,屏幕内容依然可见,视频播放.PPT 演 ...
- kubsphere应用系列(三)-创建手动流水线
准备工作 1.1 创建凭证 1.2 添加代码仓库 第一步创建流水线 第二步配置流水线 1.1选择CI/CD模板 1.2删除多余阶段 1.3 配置git仓库信息 1.4配置docker仓库信 ...
- mybatis - [13] 分页
题记部分 001 || limit select * from mybatis.user limit 2,5; 2代表偏移量,从结果集的第3行开始. 5代表返回的记录数 UserMapper List ...
- 什么是git,什么是github,git和github的使用
Git实战 注意:本项目是学习笔记,来自于哔哩哔哩武沛齐老师的Git实战视频, 网址:[武沛齐老师讲git,看完绝对上瘾!!!] https://www.bilibili.com/video/BV1n ...
- wikidata介绍和查询
Wikidata是一个大型结构化开源知识图,为维基百科等项目提供支持.我们可使用SPARQL(Wikidata官方Tutorial)对其进行查询.SPARQL是一种专为 RDF(Resource ...
- MSBuild属性
MSBuild 属性 MSBuild属性是键值对的集合,提前声明好这些属性之后,整个项目的生成都可以引用这些属性. 属性名不区分大小写. 属性都是写在 PropertyGroup 标签中. 1.声明属 ...
- python excel 读取:如何读取符合多个条件的记录【出差、外出、调休、年假】
if 语句结合or 实现:读取所有出差.外出.调休.年假的记录 if '出差' in str(c_cell) or '外出' in str(c_cell) or'调休' in str(c_cell) ...