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虚拟机 ...
随机推荐
- 十二. Redis 集群操作配置(超详细配图,配截图详细说明)
十二. Redis 集群操作配置(超详细配图,配截图详细说明) @ 目录 十二. Redis 集群操作配置(超详细配图,配截图详细说明) 1. 为什么需要集群-高可用性 2. 集群概述(及其搭建) 3 ...
- 管理虚拟机(virtual-manager)
- Python - [03] 基础语法
题记部分 一.标识符 第一个字符必须是字母表中字母或下划线_ 标识符的其他部分由字母.数字和下划线组成 标识符对大小写敏感 二.Python保留字 三.注释 (1)单行注释:以#开头 #!/usr/b ...
- SpringBoot项目war、jar自定义配置application文件的位置
此篇文章的真正目的应该是关于war包运行在独立tomcat下时,应如何在war包外部配置application.properties,以达到每次更新war包而不用更新配置文件的目的.百度搜素Sprin ...
- 基于自注意力机制的轻量级人体姿态估计(Lightweight Human Pose Estimation Based on Self-Attention Mechanism)
写在前面 本文是一篇于2023年3月21日发表在2023 International Conference on Big Data, Environmental Industry and Materi ...
- python 二级 语言基本元素笔记-字符串
l='12345' 1.递增顺序: 正向递增从0开始 负向从[-1]开始,l[1]=2,l[-1]=5 2.切片操作:左开右闭,l[2:5]=3,4 3.导入库,引入 库名.函数名 input函数 输 ...
- Windows 提权-内核利用_2
本文通过 Google 翻译 Kernel Exploits Part 2 – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- 0基础的人关于C++多态产生的一系列疑问
之前在面试的时候被问过懂不懂C++,懂不懂"多态".我之前搞科研一直在用Python,不会C++.完全没听过"多态"这个词,只听说过"多模态" ...
- 三分钟教学:手把手教你实现Arduino发布第三方库
三分钟教学:手把手教你实现Arduino发布第三方库 原文链接: 手把手教你实现Arduino发布第三方库 摘要 Arduino 发布第三方库的流程包括:构建库的基本框架后将其打包并上传至 GitHu ...
- MongoDB 复制集机制及原理
复制集的作用 MongoDB 复制集的主要意义在于实现服务高可用. 它的现实依赖于两个方面的功能: 数据写入时将数据迅速复制到另一个独立节点上 在接受写入的节点发生故障时自动选举出一个新的代替节点 在 ...