我正在開發一個.NET框架來開發對等應用程序。在之前的版本中,我使用APM模式(BeginXXX/EndXXX)完成了它,並且完美運行。我的意思是,我用VS分析器測量,結果是預期的結果,沒有意外。Socket構造函數是分配更多內存列表的函數中的第一個,爲什麼?
目前我正在更新它以使用.NET 3.5中引入的高性能改進,它是XXXAsync。但是,框架工作正常,當我看到分析器的結果(關於內存使用情況)時,Socket構造函數是「分配大部分內存的函數」中的前1位!
只是一邊評論:我期望第二個,ConnectionIoActor,將是第一個,因爲它會創建一個新的字節[1 < < 16](64Kb)。
從來就只有兩個插座進行了測試:監聽器和一個進來的連接,並深信插座的構造是不是在重構之前列表的頂部。對我來說沒有任何意義,構造函數就是同一個!
無論如何,如果這兩個都沒有意義,爲什麼socket構造函數會分配內存?
更新1:
連接是所預計的:
更新2:
有問題的插座似乎是一個偵聽連接。
更新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);
}
}
}
看,監聽套接字使用更多的內存比其他任何插座(這可能是好的,我不知道)。
這是我所看到的:
也許我誤解的東西,但無論如何,幾乎150KB。這可以嗎? 注意:在實際項目中,連接到它後,偵聽器套接字需要超過200Kb。
你可以得到*有多少個* socket對象正在創建?那將是我的下一步。 –
二:事實上,我有一個性能計數器,每當新的連接被接受時它就會自動增加(即使它是一個冗餘計數器 - 系統已經提供了它) – lontivero
好吧,這似乎很奇怪。你能用一個簡短但完整的程序重現這一切嗎? –