Страница: 1 |
Страница: 1 |
Вопрос: Утечка памяти
Добавлено: 13.01.09 07:37
Автор вопроса: admsasha | Web-сайт:
Есть вот такой код
Imports System.Net.Sockets
Imports System.IO
Imports System.Threading
Module Module1
Private Structure arrstream
Dim St1 As System.Net.Sockets.NetworkStream
Dim St2 As System.Net.Sockets.NetworkStream
End Structure
Sub Main()
Console.Write("Server starting... " & vbCrLf)
Dim Thread = New System.Threading.Thread(AddressOf tListener)
Thread.Start()
End Sub
Private Sub tListener()
Dim Client As Net.Sockets.TcpClient
Dim Stream As System.Net.Sockets.NetworkStream
Dim Stream2 As System.Net.Sockets.NetworkStream
Dim st As arrstream
'Dim Server = New TcpClient
Dim Listener = New TcpListener(Net.IPAddress.Any, 1234)
Listener.Start()
While True
Client = Listener.AcceptTcpClient() 'вот здесь обычно ждет клиента
Try
Console.Write("new client: " & Client.Client.RemoteEndPoint.ToString & vbCrLf)
Dim Server = New TcpClient("10.10.1.1", "8888")
Stream = Client.GetStream()
Stream2 = Server.GetStream()
st.St1 = Stream
st.St2 = Stream2
Dim Thread = New System.Threading.Thread(AddressOf srv1)
Thread.Start(st)
Thread.Join()
Dim Thread2 = New System.Threading.Thread(AddressOf srv2)
Thread2.Start(st)
Thread2.Join()
Catch ex As Exception
Console.Write(ex.Message & vbCrLf)
End Try
End While
End Sub
Private Sub srv1(ByVal st As arrstream)
Dim byte1(1024) As [Byte] 'Buffer
Dim message As String
'Dim st As arrstream
Dim Stream As System.Net.Sockets.NetworkStream
Dim Stream2 As System.Net.Sockets.NetworkStream
Stream = st.St1
Stream2 = st.St2
Try
While True
message = Stream.Read(byte1, 0, byte1.Length)
If Not message > 0 Then
Stream.Close()
Stream2.Close()
Exit Sub
End If
message = System.Text.Encoding.GetEncoding("windows-1251").GetString(byte1, 0, message)
Stream2.Write(byte1, 0, message.Length)
End While
Catch ex As Exception
Console.Write(ex.Message & vbCrLf)
End Try
End Sub
Private Sub srv2(ByVal st As arrstream)
Dim byte1(1024) As [Byte] 'Buffer
Dim message As String
Dim Stream As System.Net.Sockets.NetworkStream
Dim Stream2 As System.Net.Sockets.NetworkStream
Stream = st.St1
Stream2 = st.St2
Try
While True
message = Stream2.Read(byte1, 0, byte1.Length)
If Not message > 0 Then
Stream.Close()
Stream2.Close()
Exit Sub
End If
message = System.Text.Encoding.GetEncoding("windows-1251").GetString(byte1, 0, message)
Stream.Write(byte1, 0, message.Length)
End While
Catch ex As Exception
Console.Write(ex.Message & vbCrLf)
End Try
End Sub
End Module
Если коротко, то сервер сервер должен подключать сколько угодно клиентов и всё что идет на порт 1234, пересылать на 10.10.1.1:8888.
Проблемы. При подключении постоянно выделяется дополнительные 24-44 Кб.
И просьба спецам, оптимизировать и указать какие улучшения можно сделать
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
FIX
ICQ: 348680795
Вопросов: 39
Ответов: 62
Профиль | | #1
Добавлено: 13.01.09 14:52
Номер ответа: 2
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #2
Добавлено: 15.01.09 13:28
Где ты видишь что выделяется память? С чего взял что здесь утечка? По-твоему потоки и объекты - бесплатные ресурсы?
Номер ответа: 3
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #3
Добавлено: 17.01.09 15:23
Это ли утечка?
Вот у меня, помню, прога по ходу загрузки съедала 150мб ОЗУ, по крайней мере диспетчер задач так говорил.
При минимизации память освобождалась.
Я так и сделал, вписал в прогу сворачивание - разворачивание.
Номер ответа: 4
Автор ответа:
admsasha
ICQ: 234002454
Вопросов: 56
Ответов: 69
Web-сайт:
Профиль | | #4
Добавлено: 17.01.09 17:02
Если подключаться и отключаться 10 раз, то память выделится на каждый раз +44Kb, БЕЗ её освобождения. GC.Collect пробывал, эффэкта не дало.
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 23.01.09 00:25
А GC.Collect и не обязательно будет освобождать память. Посмотри как работает модель памяти в .NET, возможно будет понятнее.
Номер ответа: 6
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #6
Добавлено: 23.01.09 03:40
Абсолютно не понятно, зачем в коде присутствует данная процедура