首页 > 系统相关 >解读surging 的内存过高的原因

解读surging 的内存过高的原因

时间:2024-06-11 21:57:57浏览次数:39  
标签:堆外 收集器 开发人员 回收 解读 surging 内存 垃圾

前言

       对于.NET开发人员来讲,一个程序占用内存过高,是极其糟糕,是一款不合格的程序软件,.NET开发人员也不会去使用服务器垃圾收集器(ServerGarbageCollection),而是选用工作站垃圾收集器,而是对于一款低内存的程序更能给开发人员是一款稳定运行的程序,而对于今天写这篇文章的目的,源于客户说基于surging的服务内存一直升高,内存泄漏,在这里我可以讲解一下,以解决企业、社区用户的疑问。

是否内存泄漏?

 对于客户反应后,告诉客户把dump发过来,然后通过dump分析发现是DotNetty.Buffers.PooledByteBufferAllocator 分配堆内存未进行释放

 而对于以上的产生的问题, 就要谈到PooledByteBufferAllocator 分配的堆内内存和堆外内存,堆内内存会通过垃圾回收进行回收,而堆外内存是不会通过触发垃圾回收进行回收,而一般是当发送的消息过大,或者并发高产生消息过多都会进入到堆外内存,这样做的目的不频繁触发垃圾回收提高性能。

如何解决问题

而对于以上的问题如何解决呢?

1. 追求高性能解决方案,设置最大内存,使用服务器垃圾收集器(ServerGarbageCollection)

运行以下命令,加--memory 参数
dotnet Surging.Services.Server.dll --memory 2GB
改成服务器垃圾收集器
<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

2. 追求低内存的解决方案

Allocator设置不分配堆外内存,以下是代码:

.ChildOption(ChannelOption.Allocator, new  UnpooledByteBufferAllocator(false, true)) 

或者是设置以下donetty 参数:

Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0");

总结

如果需要企业版本,多语言异构版本,平台版本可以联系作者,QQ群:744677125

标签:堆外,收集器,开发人员,回收,解读,surging,内存,垃圾
From: https://www.cnblogs.com/fanliang11/p/18242810

相关文章

  • C语言笔记第14篇:动态内存管理
     1、为什么要有动态内存分配我们已经掌握的内存开辟方式有:创建变量charc=0;inta=0;intarr[10]={0};但是上述的开辟空间的方式有两个特点:空间开辟大小是固定的数组在声明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整但是对于空间的需求,不仅仅是......
  • 共享内存通信shm过程
    重要!!!先看这三篇segment.h-CSDN博客block.h-CSDN博客State.h-CSDN博客然后往下看初始化在listener.cc中对cyber进行初始化操作Init,并创建一个节点listener_nodemovex::cyber::Init(argv[0]);autolistener_node=movex::cyber::CreateNode("listener");创建读节......
  • AIGC-AnimateDiff论文详细解读
    AnimateDiff:AnimateYourPersonalizedText-to-ImageDiffusionModelswithoutSpecificTuninggithub:https://github.com/guoyww/animatediff/论文:https://arxiv.org/abs/2307.04725AnimateDiff通过预训练的运动模块(motionmodule),直接将现有的个性化文本到图......
  • linux内存管理(四)- 用户空间的内存分配在kernel中的实现
    malloc是常用的用户态分配内存的接口,它会调用brk系统调用来请内存分配内存。下面看看该系统调用的实现。插一句,每次调用malloc的时候未必都会调用brk去从kernel分配实际的内存,因为每次系统调用都是有开销的,为了避免频繁的陷入内核,malloc会多申请一部分内存当作内存池,之后要申请内......
  • linux内存管理(七)- 写时复制
    在fork进程的时候子进程会共享父进程的页表,但并没有分配新页。此时页表时只读的,如果父进程或者子进程写内存就会触发pagefault,内核会重新分配内存更改页表,从此分道扬镳。因此写时复制包含两部分内容,第一是fork进程时复制页表并设置pte为只读,第二是写内存发生pagefault。先来看......
  • linux内存管理(六)- 内核新struct - folio
    folio大概是5.16引入的,看起来像是page的封装,这里有一篇讲解folio很好的博客,论好名字的重要性:Linux内核page到folio的变迁-CSDN博客structfolio{/*private:don'tdocumenttheanonunion*/union{struct{/*public:*/unsignedlon......
  • linux内存管理(五)- 缺页处理
    分析一下缺页的处理。缺页的意思是在访问内存的时候该地址还没有建好页表,页面尚未分配,或者页面被swap出去或者没有权限。缺页是同步异常,用户态发生缺页异常会等待内核解决,当然这一切对于用户态都是透明的。缺页处理的核心函数是do_page_fault,这个函数是架构相关的所以这个函数分布......
  • 每日一题——Python实现PAT乙级1111 对称日(举一反三+思想解读+逐步优化)七千字好文
    一个认为一切根源都是“自己不够强”的INTJ个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数Python-3.12.0文档解读目录我的写法代码点评时间复杂度分析空间复杂度分析综上所述:优化建议我要更强优化建议完整代码和注释优化分析......
  • 深度解读ChatGPT:原理、应用与未来探索
    本文将深入剖析ChatGPT,包括其工作原理、技术栈、训练方法、应用场景、优势与挑战,以及未来发展方向。通过详尽的分析和案例,帮助读者全面理解这一先进语言模型。文章目录引言2.ChatGPT概述2.1什么是ChatGPT2.2ChatGPT的应用场景3.技术原理3.1NLP技术与目标3.2生成......
  • linux内存管理(二)- vmalloc
    个人笔记,谨慎观看.先看看vmalloc是怎么实现的。它能在非连续物理内存之上建立连续的虚拟内存映射。这里有一篇博客Linux内存管理(6)vmalloc-ArnoldLu-博客园(cnblogs.com)调用链vmalloc->_vmalloc_node->_vmalloc_node_rangevoid*__vmalloc_node(unsignedlongsize,......