2012-04-27 1 views
0

우리는 C# .Net 3.5에서 개발 된 소켓 서버를 보유하고 있습니다. 클라이언트가 연결을 끊고 연결할 때마다 서버 메모리 사용량이 증가하는 것을 봅니다. 유효한 신임 정보가 제공되지 않으면 서버는 클라이언트의 연결을 끊습니다.소켓 서버 메모리가 계속 증가합니다

클라이언트가 잘못된 자격 증명을 사용하여 연결을 시도하면 더 많은 메모리가 예약되어 겉으로보기에는 취소되지 않습니다. 클라이언트가 매 초마다 다시 연결하려고합니다. 다음은 연결 해제를 처리하는 코드입니다. 이 코드는 클라이언트가 연결을 끊고 읽기 및 쓰기 작업에서 오류가 발생할 때마다 호출됩니다.

누군가가이 문제를 디버그/해결하는 방법에 대해 안내 할 수 있습니까?

+0

당신은 클라이언트 당 하나 개의 스레드를 사용하고 있습니까? 소켓 및 스트림에서 이동/닫기를 호출하면 괜찮을까요? 그렇지 않으면 메모리 프로파일 러를 사용하여 보도록 권할 것입니다. – weismat

답변

0

처분 할 기회없이 state.workSocket 및 state를 null로 설정했을 수 있습니다.

+0

예, null로 설정하면 처리되지 않습니다. –

+0

시도 했는데도 작동하지 않았습니다. – dabididabidi

+0

Windows 서비스 인 소켓 서버에는 소켓 서비스 시작시 초기화되는 사용자 지정 성능 카운터가 있습니다. 일단 서비스가 시작되면 클라이언트 연결을 받아들이고 연결/연결 해제, 총 바이트 수, 총 바이트 아웃 등의 총 클라이언트 수를 저장하는 사용자 지정 성능 카운터를 사용합니다. 내 생각에 소켓이 닫혀있을 때, 어떻게 든 닫힌 소켓이 성능에서 참조됩니다 카운터를 사용하여 메모리를 계속 증가시킵니다. 성능 카운터를 사용하여 소켓 서비스를 실행 해봤는데 메모리가 증가하는 것을 보았습니다. – dabididabidi

0

어떻게 메모리 사용량을 측정하고 있습니까?

기계에 메모리가 부족하지 않으면 GC가 자주 수집을 수행하지 않습니다. 따라서 메모리가 삭제 된 경우에도 작업 관리자에 표시된 메모리 사용량이 증가 할 수 있습니다.

GC.Collect 호출을 추가하여 GC를 실행하도록 시도해 볼 수 있습니다. 실제로 메모리가 누출되는 경우 표시됩니다. (프로덕션 빌드에서 Collect 호출을 두지 마십시오).

MSDN 기사 : Memory Usage Auditing For .NET Applications