本文介绍: 使用Asp.Net Core Web Api框架开发网站中使用到了tcp socket通信,网站作为服务端开始tcp server,其他的客户端不断高速给它传输信息时,tcp server中读取信息每次申请的byte[]没有得到及时的释放,导致内存浪费越来越多,最终内存溢出,系统崩溃。而使用Asp.Net Core Web Api框架搭建的项目中跑这个服务端代码,则是这样的,很少引发GC,没有及时回收buffer数组的无效内存空间。,则正常引发GC,每次申请的buffer数组都得到及时的释放。
背景
使用Asp.Net Core Web Api框架开发网站中使用到了tcp socket通信,网站作为服务端开始tcp server,其他的客户端不断高速给它传输信息时,tcp server中读取信息每次申请的byte[]没有得到及时的释放,导致内存浪费越来越多,最终内存溢出,系统崩溃。
示例代码
Socket server = new Socket(SocketType.Stream, ProtocolType.Tcp);
IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 8080);
server.Bind(iPEndPoint);
server.Listen(3);
Task.Run(() =>
{
Task.Run(() =>
{
while (true)
{
Socket client = server.Accept();
while (true)
{
byte[] buffer = new byte[client.ReceiveBufferSize];
int length = client.Receive(buffer);
if (length > 0)
{
string str = Encoding.ASCII.GetString(buffer, 0, length);
Console.WriteLine(str);
}
else
{
client.Shutdown(SocketShutdown.Both);
client.Close();
client.Dispose();
break;
}
}
}
});
});
Console.ReadLine();
结论
同样的代码,使用纯控制台项目框架搭建,则正常引发GC,每次申请的buffer数组都得到及时的释放。
而使用Asp.Net Core Web Api框架搭建的项目中跑这个服务端代码,则是这样的,很少引发GC,没有及时回收buffer数组的无效内存空间
解决方案
PropertyGroup属性中添加一个子属性,保存,重新启动项目
<ServerGarbageCollection>false</ServerGarbageCollection>
再次观察GC引发的频率和内存使用状况,可以发现内存没有继续暴增了
GC模式
讨论.NET Core 配置对GC 工作模式与内存的影响 – YOYOFx – 博客园 (cnblogs.com)
原文地址:https://blog.csdn.net/qq_36694133/article/details/134736434
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_23730.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。