• 解读surging 的内存过高的原因


    前言

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

    是否内存泄漏?

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

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

    如何解决问题

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

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

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

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

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

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

    或者是设置以下donetty 参数:

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

    总结

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

  • 相关阅读:
    微前端qiankun
    如何查询外文文献?
    Golang使用自定义IP请求https
    pytorch gpu安装
    SQL的ROUND函数用法及其实例
    计算机视觉与深度学习-循环神经网络与注意力机制-RNN(Recurrent Neural Network)、LSTM-【北邮鲁鹏】
    PostgreSQL数据库常用方法
    5Python的Pandas:数据结构
    Redis(五)——Redis的Java客户端
    数据挖掘与机器学习:数据挖掘算法原理与实践:数据预处理
  • 原文地址:https://www.cnblogs.com/fanliang11/p/18242810