成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

走進異步世界:EnyimMemcached異步化改造引起的內存泄漏

開發 后端
造成內存泄漏的根源是我們沒有對SocketAsyncEventArgs進行Dispose,實際情況是我們當時根本沒注意到SocketAsyncEventArgs實現了IDispose接口,而這個小小的疏忽竟然折騰了我們一個星期。

6月30日我們發布了異步化改造后的博客程序之后,出現了高內存、高CPU、高線程數的不理想情況。

經過一周的追查,終于水落日出——引起不理想情況的根源是我們修改過的EnyimMemcached代碼存在內存泄漏問題。

而造成內存泄漏的根源是我們沒有對SocketAsyncEventArgs進行Dispose,實際情況是我們當時根本沒注意到SocketAsyncEventArgs實現了IDispose接口,而這個小小的疏忽竟然折騰了我們一個星期。

存在內存泄漏問題的代碼是這樣寫的:

a) 異步從Socket中讀取數據:

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

b) 異步向Socket中寫入數據:

  1. public async Task WriteSync(IList<ArraySegment<byte>> buffers)  
  2. {  
  3.     var args = new SocketAsyncEventArgs();  
  4.     args.BufferList = buffers;  
  5.     var awaitable = new SocketAwaitable(args);  
  6.     await this.socket.SendAsync(awaitable);  

解決內存泄漏問題的方法很簡單,using+Buffer.BlockCopy,代碼如下:

a) 改進后的異步從Socket中讀取數據:

  1. public async Task<byte[]> ReadBytesAsync(int count)  
  2. {  
  3.     using (var args = new SocketAsyncEventArgs())  
  4.     {  
  5.         args.SetBuffer(new byte[count], 0, count);  
  6.         var awaitable = new SocketAwaitable(args);  
  7.         await this.socket.ReceiveAsync(awaitable);  
  8.         var receivedBytes = new Byte[args.BytesTransferred];  
  9.         Buffer.BlockCopy(args.Buffer, 0, receivedBytes, 0, args.BytesTransferred);  
  10.         return receivedBytes;  
  11.     }  

b) 改進后的異步向Socket中寫入數據:

  1. public async Task WriteSync(IList<ArraySegment<byte>> buffers)  
  2. {  
  3.     using (var args = new SocketAsyncEventArgs())  
  4.     {  
  5.         args.BufferList = buffers;  
  6.         var awaitable = new SocketAwaitable(args);  
  7.         await this.socket.SendAsync(awaitable);  
  8.     }              

改進后的代碼已發布至github:https://github.com/cnblogs/EnyimMemcached

你也許會問我們是如何監測到內存泄漏情況的呢?

我們借助于兩個工具:Windows任務管理器與性能監視器。

1. 通過任務管理器,我們觀察到w3wp占用的內存會持續增長,當到達5G左右,在8核8G的阿里云虛擬機上CPU就開始做坐過山車,只有回收程序池(重啟w3wp進程)才能恢復正常。

2. 通過性能監視器,我們監測了兩個指標:

a) \.NET CLR Memory(w3wp)\# Bytes in all Heaps (針對托管內存)

b) \Process(w3wp)\Private Bytes (針對非托管內存)

觀察到的情況見下圖:

性能監視器Bytes in all Heaps與Private Bytes

(綠色是Private Bytes

Bytes in all HeapsPrivate Bytes都會出現持續增長。

而對SocketAsyncEventArgs進行Dispose之后,性能監視器看到的\.NET CLR Memory\# Bytes in all Heaps變成了這樣:

性能監視器Bytes in all Heaps

\Process\Private Bytes也與Bytes in all Heaps相映成輝:

性能監視器Private Bytes

一看到這樣的圖形,你應該和我們一樣感覺到了GC在背后辛勤工作的身影。 

原文鏈接:http://www.cnblogs.com/cmt/p/sokcet_memory_leak.html

責任編輯:林師授 來源: 博客園團隊
相關推薦

2017-11-14 10:23:20

HTTP服務異步

2016-09-08 16:16:26

iOS移動應用內存泄漏

2023-06-02 18:37:14

Dubbo異步化接口

2011-08-29 09:59:26

2012-01-09 10:55:44

虛擬化桌面虛擬化KVM

2021-11-29 18:34:14

內存異步死循環

2010-09-14 10:15:24

2011-06-02 09:39:29

ADO.NET

2021-01-15 11:01:42

IT系統漏洞網絡攻擊

2022-06-15 16:04:13

Java編程語言

2013-04-01 15:38:54

異步編程異步編程模型

2013-04-01 15:25:41

異步編程異步EMP

2011-02-22 08:49:16

.NET同步異步

2018-10-18 09:34:16

高并發異步化并行化

2011-02-22 09:09:21

.NETAsync CTP異步

2022-01-10 09:31:17

Jetty異步處理seriesbaid

2013-08-07 10:07:07

Handler內存泄露

2010-07-05 09:07:42

2011-02-24 12:53:51

.NET異步傳統

2017-07-06 17:39:53

JavaScript開發程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人永久免费视频 | 黄色大片免费观看 | 亚洲一二三区在线观看 | 一区二区三区韩国 | 亚洲一二三区在线观看 | 色婷婷av99xx | 一区二区三区四区电影视频在线观看 | 久久久久久久久久影视 | 在线观看深夜视频 | 国产精品久久久久久久粉嫩 | 国产精品视频久久久 | 午夜天堂精品久久久久 | 日本一区二区三区四区 | 精品国产乱码久久久久久图片 | 91正在播放 | 精品美女在线观看视频在线观看 | 久久噜噜噜精品国产亚洲综合 | 黄网站涩免费蜜桃网站 | 欧美日韩成人在线 | 国产精品国产成人国产三级 | 国产一区二区小视频 | 日本黄视频在线观看 | 日本欧美国产在线观看 | 91精品国产乱码久久久久久久 | 国产露脸对白88av | 日本国产一区二区 | av一级久久| 国产95在线 | 国产一级片免费视频 | 91视频一区二区三区 | 伊人久久综合影院 | 欧美精品一区二区在线观看 | 国产精品免费播放 | 99免费在线 | 超碰av在线 | 欧美一区二区三区四区五区无卡码 | 中文字幕不卡 | 亚洲一区在线日韩在线深爱 | 成人精品一区亚洲午夜久久久 | 欧美一区免费 | 有码在线|