• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

안녕하세요 강의 도중 궁금한 점이 있어서 질문 드려요

22.02.04 03:10 작성 조회수 126

1

채팅 테스트 #1 강의에서 6분 19초 쯤에  Clear 함수를 만들어서 샌드 큐랑 팬딩 리스트 클리어 해주시는데

만약 Session을 Disconnect하고 난 후에 재사용 안한다고 가정한다면 저기 Clear 함수를 호출 안해주면 발생하는 문제가 있나요?

저걸 안해줘도 크게 문제가 없어보이는데 해주시는 이유가 궁금합니다. 다른 특별한 이유가 있는지 궁금해요

안해주면 메모리 릭이라든지 그런게 발생할 수 있나요..? 정확히 어떤 이유에서 Clear를 해주는지가 궁금합니다 강사님~!

답변 1

답변을 작성해보세요.

1

C# 서버 구조가 제 C++ 서버 라이브러리 구조에서
그대로 따온거라, 비슷하게 만들어서 있는 것이구요.
어차피 더 이상 필요하지 않으니 미리 정리하는 개념이지만,
C# 기준으로는 안 하더라도 딱히 문제는 없습니다.

(불필요하게 참조값을 들고 있어서 메모리 해제가 안 되거나,
C++ 기준의 순환 참조 문제를 예방하기 위해 날려주는 것입니다.)


ReceiveAsync 를 호출한 Session객체가 Disconnect로 정리시켜주고 Session객체가 모든 참조 영역에서 벗어난 후 GC.Collect()를 호출을 해도 Session의 소멸자가 호출이 안됩니다.. ㅠㅠ 혹시 왜그런지 알 수 있을까요.. 뭔가 비동기 Receive에서 순환 참조되어서 소멸자가 호출이 안되는 것 같은데 구글링하고 별짓을 다 해보고 있는데 원인을 알 수 가 없네요..

수도 코드로 보시면

void MakeLocalSession(){

 Session session = new Session()

session.RegisterRecv();

session.Disconnect();

}

 

void Main(){

  MakeLocalSession();

 while(true) {

    GC.Collect();   

    Sleep(10);

   }   

}

 

위 코드는 이해를 돕기 위해 조금 극단적으로 작성한 코드 입니다. 제가 말하는게 어떤건지 이해만 부탁드릴게요.. RegisterRecv를 호출 안 하면 Session 객채는 저 함수 블럭이 끝나고 GC에 들어가  GC.Collect() 호출 되고 나면 소멸자가 잘 호출이되어집니다..

하지만 RegisterRecv를 하면 Disconnect를 해줘도 Session객채를 참조하는 부분이 하나도 없는데도 GC.Collect()를 해줘도 소멸자가 호출이 안됩니다.. ㅠㅠ 지금 서버 부하 테스트를 진행하고 있는데 계속 해서 조금씩 조금씩 메모리가 새고 있고 정리는 안되는 것 같아 찾고 찾고 찾는 중 저 부분이 의심이되어서 질문을 남깁니다..

흥미로운 실험인데요.
C#의 경우, C++ 스마트 포인터처럼 RefCount 기반의 관리는 아니라서
순환 참조라기 보단 그냥 어딘가에 Session 참조값을 들고 있어서 그럴 것 같습니다.

윗 부분 (ReceiveAsync)이 가장 의심되고

recvArgs가 OnRecvCompleted를 연결하는 과정에서 Session의 참조값을 들고 있어서
일어나는 문제로 보입니다.

다만 테스트 환경이 아닌 일반 환경에선
연결이 끊기면 Recv 0로 인해 종료 처리되고,
백그라운드에서 예약하는 ReceiveAsync가 재차 호출되지 않아
동일한 문제는 일어나지 않을 것으로 '일단' 예상되는데
이 부분은 실험이 필요할 것 같네요.
그리고 Clear 하는 부분에서 recvArgs 정리 등도 해보시기 바랍니다.

 

AsyncEventArgs 관련 Memory Leak 관련해보면 비슷한 글들이 많은 것을 볼 수 있는데요.
SetBuffer(null, 0, 0)와 Dispose처리까지 해줬는데 해결이 안 됐나요?
그건 좀 놀랍네요 -ㅁ-
아래 블로그에서 나온 내용을 다 해보신 것 같은데 저도 원인을 잘 모르겠습니다.
시간 될 때 파보도록 하겠습니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=blackcsy8&logNo=220936852495

강사님.. 죄송합니다.. ㅠ 컨텐츠 영역에서 물고 있었습니다..!!

그렇군요 ㅎㅎㅎ 무사히 찾으셨다니 다행입니다.
AsyncEventArgs가 IDisposable인 것은 몰랐는데,
질문주신 덕분에 이렇게 또 새로 알아가네요.
저 대신 열심히 테스트(?)를 돌려 주셔서 감사 드립니다 ㅎㅎ