Socket构造函数是分配更多内存列表的函数中的第一个,为什么?

时间:2013-08-05 05:48:50

标签: .net sockets memory profiling

我正在开发一个.NET框架来开发点对点应用程序。在之前的版本中,我用APM模式(BeginXXX / EndXXX)完成了它并且它工作得很好。我的意思是,我用VS分析器进行测量,结果是预期的,没有惊喜。

目前我正在更新它以使用.NET 3.5中引入的高性能改进,它是XXXAsync。然而,框架工作正常,当我看到探查器的结果(关于内存使用)时,Socket构造函数是“分配大多数内存的函数”中的前1名!

只是一个侧面评论:我期望第二个,ConnectionIoActor,它将是最高的一个,因为它创建一个新的字节[1<< 16](64Kb)。 enter image description here

我只用两个套接字测试它:监听器和一个接收连接,并确保套接字构造函数在重构之前不在该列表的顶部。对我来说没有任何意义,构造函数就是同一个!

无论如何,如果这对你来说没有意义,为什么套接字构造函数会分配那个内存?

更新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 个答案:

答案 0 :(得分:0)

内存分配是由System.Net.Socket构造函数使用的System.Net.Logging引起的。禁用System.Net日志记录可能会有所帮助。 IMO没有什么可担心的。