写点什么

解读 surging 的内存过高的原因

  • 2024-06-12
    福建
  • 本文字数:745 字

    阅读完需:约 2 分钟

前言


       对于.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>--memory 
复制代码


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


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

.ChildOption(ChannelOption.Allocator, new  UnpooledByteBufferAllocator(false, true)) 
复制代码


或者是设置以下 donetty 参数:

Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0");
复制代码


文章转载自:fanly11

原文链接:https://www.cnblogs.com/fanliang11/p/18242810

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
解读surging 的内存过高的原因_内存_不在线第一只蜗牛_InfoQ写作社区