首页 > 系统相关 >DOTNET内存占用优化

DOTNET内存占用优化

时间:2024-11-08 16:46:45浏览次数:4  
标签:collector 占用 dotnet 内存 https DOTNET runtime com

很长时间以来我都在公司dotnet开发的软件上做各种性能优化,包括各种崩溃、线程池资源不足、死锁、以及很多性能慢的代码问题等,类似这种cpu相关问题都比较好查出来。
这个过程中经常遇到内存占用过高的问题,也是各种办法都试用了一遍,包括DOTNET GC相关的各种配置,还给docker加内存限制,但是一直都解决不了,比如以下这些:

  1. 服务器模式:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#workstation-vs-server
  2. 后台垃圾回收:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#background-gc
  3. 动态适应应用程序大小 (DATAS):https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#dynamic-adaptation-to-application-sizes-datas
  4. 高内存百分比:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#high-memory-percent
  5. 节省内存:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#conserve-memory

以上全部解决不了问题,通过dump-counters诊断看,GC012代以及LOH等占用都不高,但是WorkingSet占用是它们总和的好几倍,并且长时间保持这个状态。意思就是程序实际并没有使用太多内存,但是整个进程看内存占用却很高,似乎GC工作了但并没有把内存释放回操作系统。通过dump分析内存发现大量的空闲内存,碎片也没有那么多。空闲的内存是程序曾经高负载时申请使用的,之后低负载就没有释放回操作系统。

搜索后发现了两个dotnet的issues:
https://github.com/dotnet/runtime/issues/90640
https://github.com/dotnet/runtime/issues/49317
看来遇到这个问题的不只我一个人,似乎从dotnet7开始就会有这个问题,dotnet8加入的DATAS配置也无法解决这个问题。

按照这个issue说的加这两个环境变量,验证发现真的可以解决问题,只是cpu占用会稍微多点,这个可以接受。

MALLOC_ARENA_MAX: 2
MALLOC_TRIM_THRESHOLD_: 85000

这个问题可能针对的是不太单纯的应用程序,会出现有时需要更多内存,而常规情况下只需要少量内存的情况。

标签:collector,占用,dotnet,内存,https,DOTNET,runtime,com
From: https://www.cnblogs.com/pains/p/18535414

相关文章

  • 深入理解Java虚拟机 --- 内存分配与回收策略
    对象优先在Eden区分配大多数情况下,对象在Eden区进行分配。当Eden区没有足够的空间来进行分配时,就会触发YoungGC(MinorGC)。当触发YoungGC时,如果Survivor区不够放存活的对象,那么就会触发分配担保机制提前转移到老年代。大对象直接进入老年代大对象的问题:1、容易导致内存明......
  • mysql分区表占用大量容量处理(优化)及归档分区表
    背景生产环境中,某个分区表两三年了,占用磁盘1T多,需要对前几年的数据做归档点击查看代码SELECTtable_schemaas'数据库',table_nameas'表名',table_rowsas'记录数',truncate(data_length/1024/1024,2)as'数据容量(MB)',truncate(index_length/1024/1024......
  • (C语言)内存函数
    目录1)memcpy 1)memcpy的模拟实现2)memmove2)memmove的模拟实现3)memset4)memcmp1)memcpymemcpy是内存拷贝函数,其不同于strncpy在于其能拷贝任意数组;形式:void*memcpy(void*destinatoin,char*source,size_t num);destination是目标空间地址,source是源空间地址;num是拷贝......
  • 车道占用预警系统
    车道占用预警系统基于AI人工智能机器视觉分析识别技术,车道占用预警系统利用现场监控摄像头对规定车道区域进行实时监测,通过先进的图像识别算法,能够自动分析车道上的车辆和大型占道物,一旦监测到有人违规占用应急车道,系统会立即发出告警,提醒相关人员及时处理。相较于传统监管方式,车......
  • glibc 内存分配与释放机制详解
    作者:来自vivo互联网存储团队-WangYuzhi本文以一次线上故障为基础介绍了使用glibc进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方案。一、引言内存对象的分配与释放一直是后端开发人员代码设计中需要考虑的问题,考虑不周极易......
  • dotnet cli publish 命令行发布脚本 bat shell
    dotnetcli发布脚本publish_remote.bat该脚本实现一键主要发布到远程的共享文件夹中@echooff::定义变量SHARE_PATH:共享文件夹,SOURCE_DIR:代码发布的文件夹,TARGET_DIR:目标文件夹(共享文件夹的映射)setPRO_PATH=.\WebAppsetSHARE_PATH=\\pcmesone\Reportset......
  • ABAP开发-内存管理
    系列文章目录文章目录系列文章目录前言一、概述二、程序间调用三、外部会话和内部会话四、SAP内存与ABAP内存五、实例总结前言一、概述内存是程序之间为了传递数据而使用的共享存储空间,在每个程序里使用的内存有SAP内存和ABAP内存SAP内存分类SAP内存......
  • 书接上回说一说 JVM 中的方法区和直接内存
    方法区:在《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上是堆内存的一部分,但一些简单的实现可能不会选择对方法区进行垃圾回收或者进行压缩。但对于HotSpot虚拟机来说,方法区还有一个名字叫Non-Heap(非堆)目的就是要和方法区分开。所以,这样来看,方法区是一块独立于......
  • dotnet core微服务框架Jimu ~ 会员注册微服务
     提供会员注册服务,用户必须注册成会员才能享受应用提供的服务,如浏览和发布新闻,但有些服务又需要指定角色的会员才能操作,如所有会员都可以浏览新闻,只有管理员(admin)角色的会员才可以发布新闻。有2个公开的api:CheckName:判断用户名是否可用;Register:根据用户名注册......
  • AI智能分析视频分析网关室内消防逃生通道占用检测算法详解
    在公共安全领域,特别是在火灾等紧急状况下,确保消防逃生通道的畅通对于快速疏散人群至关重要。但是,由于多种原因,这些逃生通道常常被堵塞或占用,极大地增加了疏散时的风险。为了应对这一挑战,人工智能驱动的室内消防逃生通道占用视频分析网关应运而生,成为提高消防安全水平的关键工具。......