对于.NET开发人员来说,程序占用过高内存是一个严重问题。.NET开发人员通常不会选择服务器垃圾收集器(ServerGarbageCollection),而是使用工作站垃圾收集器。低内存占用的程序更加稳定。本文旨在解决基于surging的服务内存升高和内存泄漏问题,以帮助企业和社区用户解决相关疑问。
是否存在内存泄漏?
在客户反馈后,通过分析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。
标签:游戏攻略