2013-08-05 19 views
0

我正在開發一個.NET框架來開發對等應用程序。在之前的版本中,我使用APM模式(BeginXXX/EndXXX)完成了它,並且完美運行。我的意思是,我用VS分析器測量,結果是預期的結果,沒有意外。Socket構造函數是分配更多內存列表的函數中的第一個,爲什麼?

目前我正在更新它以使用.NET 3.5中引入的高性能改進,它是XXXAsync。但是,框架工作正常,當我看到分析器的結果(關於內存使用情況)時,Socket構造函數是「分配大部分內存的函數」中的前1位!

只是一邊評論:我期望第二個,ConnectionIoActor,將是第一個,因爲它會創建一個新的字節[1 < < 16](64Kb)。
enter image description here

從來就只有兩個插座進行了測試:監聽器和一個進來的連接,並深信插座的構造是不是在重構之前列表的頂部。對我來說沒有任何意義,構造函數就是同一個!

無論如何,如果這兩個都沒有意義,爲什麼socket構造函數會分配內存?

更新1:

連接是所預計的: enter image description here

更新2:

有問題的插座似乎是一個偵聽連接。

enter image description here enter image description here

更新3:

有了這個代碼可以複製它。在Main方法中,我分配一個100kb的數組,以確保我看到的是可以的,而且是這樣。

using System.Net; 
using System.Net.Sockets; 

namespace SocketMemeoryTest 
{ 
    class Listener 
    { 
     static void Main() 
     { 
      var forComparison = new byte[100*1024]; 
      new Listener(3453).Start(); 
     } 

     private readonly IPEndPoint _endpoint; 
     private readonly Socket _listener; 

     public Listener(int port) 
     { 
      _endpoint = new IPEndPoint(IPAddress.Any, port); 
      _listener = new Socket(_endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
     } 

     public void Start() 
     { 
      _listener.SetIPProtectionLevel(IPProtectionLevel.Unrestricted); 
      _listener.Bind(_endpoint); 
      _listener.Listen(4); 
      var saea = new SocketAsyncEventArgs(); 
      var async = _listener.AcceptAsync(saea); 
     } 
    } 
} 

看,監聽套接字使用更多的內存比其他任何插座(這可能是好的,我不知道)。

這是我所看到的:

enter image description here

也許我誤解的東西,但無論如何,幾乎150KB。這可以嗎? 注意:在實際項目中,連接到它後,偵聽器套接字需要超過200Kb。

+1

你可以得到*有多少個* socket對象正在創建?那將是我的下一步。 –

+0

二:事實上,我有一個性能計數器,每當新的連接被接受時它就會自動增加(即使它是一個冗餘計數器 - 系統已經提供了它) – lontivero

+0

好吧,這似乎很奇怪。你能用一個簡短但完整的程序重現這一切嗎? –

回答

0

內存分配歸因於System.Net.Socket構造函數使用的System.Net.Logging。禁用System.Net日誌記錄可能會有所幫助。國際海事組織沒有什麼可擔心的。

相關問題