解读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

相关推荐
fanly112 天前
基于木舟平台浅谈surging 的热点KEY的解决方法
surging microservice
fanly1110 天前
基于surging的木舟平台如何构建起微服务
surging microservice
fanly1112 天前
基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备
surging microservice
fanly1117 天前
基于surging 的木舟平台如何通过HTTP网络组件接入设备
surging microservice
fanly111 个月前
基于surging的木舟平台如何上传模块热部署
surging microservice
fanly113 个月前
基于surging 如何利用peerjs进行语音视频通话
surging microservice
fanly113 个月前
基于surging的木舟IOT平台如何添加网络组件
surging microservice
fanly113 个月前
基于surging的产品项目-木舟开源了!
surging microservice
fanly117 个月前
如何基于surging跨网关跨语言进行缓存降级
surging microservice