最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
前言
對於.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