【问题标题】:How to avoid Memory leak in .NET SSLStream如何避免 .NET SSLStream 中的内存泄漏
【发布时间】:2019-12-10 06:22:33
【问题描述】:

我在 VB.NET 中设计了一个 SSL 服务器。

但是,当我收到对我的服务器的多个 TCP 请求(每秒 10 秒)时,我遇到了内存泄漏。意味着每次收到请求时内存都会增加。

模拟错误的过程:

  1. 监听 HTTPS (443) 端口。
  2. 从浏览器发出多个请求。
  3. 处理请求后关闭连接。

这会导致程序在每次请求时增加内存使用量。

我尝试运行 GC.collect() 但没有任何效果。

请在附件中找到以下代码:

Private HTTPS_Listener As Socket = Nothing

Private Sub ListenS()
    Try
        HTTPS_Listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Dim ep As New Net.IPEndPoint(IPAddress.Any, 443)
        HTTPS_Listener.Bind(ep)
        HTTPS_Listener.Listen(1024)
        HTTPS_Listener.BeginAccept(New AsyncCallback(AddressOf DoSecureCallBack), Nothing)
    Catch ex As Exception
        Console.WriteLine(ex.ToString)
    End Try
End Sub

Private Sub DoSecureCallBack(ByVal ar As IAsyncResult)
    Dim sock As Socket = Nothing
    Try
        sock = HTTPS_Listener.EndAccept(ar)
        Console.WriteLine(vbCrLf + vbCrLf + vbCrLf + "Conn received " + Threading.Interlocked.Increment(iCon).ToString)
    Catch ex As Exception
        Add_Log(0, "ERROR", "WebServer", "Could not accept web connection." + vbCrLf + ex.Message)
        Exit Sub
    Finally
        HTTPS_Listener.BeginAccept(New AsyncCallback(AddressOf DoSecureCallBack), Nothing)
    End Try

    Dim myNS As NetworkStream = Nothing
    Dim mySSLStream As SslStream = Nothing

    'Process Web Request
    Dim bytesRead As Integer = -1
    Try
        myNS = New NetworkStream(sock, False)
        mySSLStream = New SslStream(myNS, False)
        mySSLStream.AuthenticateAsServer(cert_Socket, False, SslProtocols.Tls12, False)

        mySSLStream.Write(btOut, 0, btOut.Length)
    Catch ex As Exception
        If bytesRead > 0 Then
            Console.WriteLine("Could not process Web Request." + vbCrLf + ex.Message)
        End If
    Finally
        If Not mySSLStream Is Nothing Then
            mySSLStream.Close()
            mySSLStream.Dispose()
        End If
        If Not myNS Is Nothing Then
            myNS.Close()
            myNS.Dispose()
        End If
        If Not sock Is Nothing Then
            sock.Close()
        End If
        sock = Nothing
    End Try
End Sub 'DoAcceptSocketCallback

【问题讨论】:

标签: .net vb.net ssl memory-leaks sslstream


【解决方案1】:

检查GC.GetTotalMemory 以确保您有泄漏;它可能只是根据可用的大量内存为进程分配更多内存,并且比重用内存更便宜。如果是这种情况,那么在切换到重用内存时,内存增加会在某个时候达到平稳状态。

此外,如果您可以切换到 .NET Core 3.0 并使用 Async/Await 而不是 Begin/End 进行异步,则每次接受时还应该使用更少的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2018-04-08
    相关资源
    最近更新 更多