난 간단한 .net 3.5sp1 윈도우 응용 프로그램 (C#에서) UDP 서버 역할을합니다. 포트에서 청취하고 엔드 포인트에서 데이터를 수신 한 다음 수신 한 데이터를 다른 엔드 포인트 (즉, 라이브 브로드 캐스트 데이터 스트림의 릴레이)로 재전송합니다. 내가 겪고있는 것은 연결이 약 20 분 동안 지속 된 후에, 악화되기 시작한 것입니다. 또한 나는 그것이 초당 약 50-100K의 메모리를 차지하고 있음을 발견했다. 이것은 GC 이후에 출시되지 않는다. 앱을 닫고 다시 시작해야합니다. 안좋다. SendToAsync 메모리 누출?
var sendBuffer = new byte[readCount];
Array.Copy(readData, sendBuffer, readCount);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.RemoteEndPoint = p.EP;
args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
SwitchWindow.LineSocket.SendToAsync(args);
사람이 SendToAsync와 메모리 누수 어떤 경험이 있습니까
: 나는 다른쪽으로 재전송을 수행하는 다음 코드에 문제를 좁혀?UPDATE :
내가 소켓이 초기화 된 상태 개체 (한 번만 수행)를 인스턴스화합니다. 상태 개체에는 "buffer"라는 속성이 있으며이 속성은 바이트 배열입니다. 나는 그런처럼 소켓에서 데이터 비동기가 나타납니다
private void beginReceiveData(ref MessageState state)
{
var ipeSender = new IPEndPoint(IPAddress.Any, 0);
var epSender = (EndPoint)ipeSender;
state.workSocket = LineSocket;
state.EP = epSender;
state.workSocket.BeginReceiveFrom(state.buffer, 0, MessageState.BufferSize,
SocketFlags.None, ref epSender,
new AsyncCallback(ReceiveDataCB),
state);
}
, 그때 내 콜백 (ReceiveDataCB)에, 내가 비동기 객체를 검색하고, 다음 처리를위한 또 다른 기능으로 바이트 버퍼를 통과 한 차례 통화에서 위에 게시 된 코드는 다른 쪽 (state.buffer는 readData가됩니다)으로 다시 전송합니다.
업데이트 # 2 :
내 직감에 따라, 나는 SocketAsyncEventArgs과 SendToAsync 치우는 다음에 보내는 코드를 변경 : 물론,
var sendBuffer = new byte[readCount];
Array.Copy(readData, sendBuffer, readCount);
SwitchWindow.LineSocket.BeginSendTo(
sendBuffer, 0, sendBuffer.Length, SocketFlags.None,
p.EP, new AsyncCallback(echoCB), null);
을 그리고, 내가 추가 한 " echoCB "EndSendTo를 호출하는 것 외에는 아무것도 수행하지 않는 콜백. 메모리 누수가 이제 사라졌습니다! 나는 그것이 너무 많은 SocketAsyncEventArgs 객체를 생성하는 것과 관련이 있고, 비동기 함수가 각 패킷 (초당 33 패킷)에 매달려 있다고 의심한다. SocketAsyncEventArgs에 대한 MSDN 설명서를 다시 한 번 살펴 봤습니다. 서버 "예제"코드가 제공되면 SocketAsyncEventArgs 개체 풀을 사용한다는 것을 알았습니다. 나는 그것이 그것을 사용하고있는 방식대로 작동하도록 정말로 고안된 것이라고 생각하지 않는다. 전체적인 요점은 각 호출에 대해 이러한 버퍼 등을 인스턴스화 할 필요가 없으므로 재사용하고 서버의 성능을 향상시키는 것입니다.
내가 –