iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解决EnyimMemcached异步化改造引起的内存泄漏问题
  • 229
分享到

如何解决EnyimMemcached异步化改造引起的内存泄漏问题

2023-06-17 07:06:02 229人浏览 安东尼
摘要

如何解决EnyimMemcached异步化改造引起的内存泄漏问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。6月30日我们发布了异步化改造后的博客程序之后,出现了高内存、高C

如何解决EnyimMemcached异步化改造引起的内存泄漏问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

6月30日我们发布了异步化改造后的博客程序之后,出现了高内存、高CPU、高线程数的不理想情况。

经过一周的追查,终于水落日出。引起不理想情况的根源是我们修改过的EnyimMemcached代码存在内存泄漏问题。

而造成内存泄漏的根源是我们没有对SocketAsyncEventArgs进行Dispose,实际情况是我们当时根本没注意到SocketAsyncEventArgs实现了IDispose接口,而这个小小的疏忽竟然折腾了我们一个星期。

存在内存泄漏问题的代码是这样写的:

a) 异步从Socket中读取数据:

public async Task<byte[]> ReadBytesAsync(int count)  {      var args = new SocketAsyncEventArgs();      args.SetBuffer(new byte[count], 0, count);      var awaitable = new SocketAwaitable(args);      await this.socket.ReceiveAsync(awaitable);                  return args.Buffer;  }

b) 异步向Socket中写入数据:

public async Task WriteSync(IList<ArraySegment<byte>> buffers)  {      var args = new SocketAsyncEventArgs();      args.BufferList = buffers;      var awaitable = new SocketAwaitable(args);      await this.socket.SendAsync(awaitable);  }

解决内存泄漏问题的方法很简单,using+Buffer.BlockCopy,代码如下:

a) 改进后的异步从Socket中读取数据:

public async Task<byte[]> ReadBytesAsync(int count)  {      using (var args = new SocketAsyncEventArgs())      {          args.SetBuffer(new byte[count], 0, count);          var awaitable = new SocketAwaitable(args);          await this.socket.ReceiveAsync(awaitable);          var receivedBytes = new Byte[args.BytesTransferred];          Buffer.BlockCopy(args.Buffer, 0, receivedBytes, 0, args.BytesTransferred);          return receivedBytes;      }  }

b) 改进后的异步向Socket中写入数据:

public async Task WriteSync(IList<ArraySegment<byte>> buffers)  {      using (var args = new SocketAsyncEventArgs())      {          args.BufferList = buffers;          var awaitable = new SocketAwaitable(args);          await this.socket.SendAsync(awaitable);      }              }

改进后的代码已发布至GitHubhttps://github.com/cnblogs/EnyimMemcached。

你也许会问我们是如何监测到内存泄漏情况的呢?

我们借助于两个工具windows任务管理器与性能监视器。

通过任务管理器,我们观察到w3wp占用的内存会持续增长,当到达5G左右,在8核8G的阿里云虚拟机上CPU就开始做坐过山车,只有回收程序池(重启w3wp进程)才能恢复正常。

通过性能监视器,我们监测了两个指标:

a) \.net CLR Memory(w3wp)\# Bytes in all Heaps (针对托管内存)

b) \Process(w3wp)\Private Bytes (针对非托管内存)

观察到的情况见下图:

如何解决EnyimMemcached异步化改造引起的内存泄漏问题

(绿色是Private Bytes)

Bytes in all Heaps与Private Bytes都会出现持续增长。

而对SocketAsyncEventArgs进行Dispose之后,性能监视器看到的\.NET CLR Memory\# Bytes in all Heaps变成了这样:

如何解决EnyimMemcached异步化改造引起的内存泄漏问题

\Process\Private Bytes也与Bytes in all Heaps相映成辉:

如何解决EnyimMemcached异步化改造引起的内存泄漏问题

一看到这样的图形,你应该和我们一样感觉到了GC在背后辛勤工作的身影。

看完上述内容,你们掌握如何解决EnyimMemcached异步化改造引起的内存泄漏问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何解决EnyimMemcached异步化改造引起的内存泄漏问题

本文链接: https://www.lsjlt.com/news/287808.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决EnyimMemcached异步化改造引起的内存泄漏问题
    如何解决EnyimMemcached异步化改造引起的内存泄漏问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。6月30日我们发布了异步化改造后的博客程序之后,出现了高内存、高C...
    99+
    2023-06-17
  • 如何解决PHP开发中的内存泄漏问题
    导语:内存泄漏是指程序执行时无法释放已经分配的内存,导致内存占用不断增加,最终导致程序崩溃。在PHP开发中,内存泄漏是一个普遍存在的问题。本文将介绍如何解决PHP开发中的内存泄漏问题,并提供具体的代码示例。一、使用unset()函数手动释放...
    99+
    2023-10-21
    内存泄漏 解决方法 PHP开发
  • 如何解决ie img标签内存泄漏的问题
    这篇文章主要介绍如何解决ie img标签内存泄漏的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! html代码: <html> <head> &n...
    99+
    2022-10-19
  • 如何解决ie中img标签内存泄漏的问题
    这篇文章主要为大家展示了“如何解决ie中img标签内存泄漏的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决ie中img标签内存泄漏的问题”这篇文章吧...
    99+
    2022-10-19
  • 如何解决Go语言中的并发内存泄漏问题?
    如何解决Go语言中的并发内存泄漏问题?引言:随着大数据和云计算时代的到来,对于并发编程的需求变得越来越迫切。而Go语言作为一门支持高并发的语言,受到了广泛的关注和应用。然而,并发编程不仅仅带来了高性能和高效率,同时也带来了一些风险,其中最常...
    99+
    2023-10-22
    内存管理 并发控制 内存泄漏修复
  • 如何解决vuex数据异步造成初始化时没值报错的问题
    这篇文章主要介绍如何解决vuex数据异步造成初始化时没值报错的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当使用vue做登录的时候,我们会把拿到的部分用户信息存在vuex+co...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作