Microsoft MVP성태의 닷넷 이야기
.NET Framework: 1074. RuntimeType의 메모리 누수? [링크 복사], [링크+제목 복사],
조회: 18790
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

RuntimeType의 메모리 누수?

아래와 같은 질문이 왔는데요,

안녕하세요 글 잘봤습니다. 많은 도움이 되었습니다.
제가 짠 프로그램에 대한 질문이 있어 글을 남깁니다.. vs를 사용해서 스냅샷을 남기는 방식으로 개체의 수를 비교해보았는데요..

개체형식: RuntimeType Object[] [고정된 핸들]
이런식으로 표현되며 어느 순간에 개체 참조 수가 증가를 하는데 그 기준을 못잡겠습니다..

혹시 여기에 대해 어떻게 생각하시나요 ㅠ?

runtimeType_0.png

그러니까 결국 이전 글은,

Visual Studio 디버깅 중 GC Heap 상태를 보여주는 "Show Diagnostic Tools" 메뉴 사용법
; https://www.sysnet.pe.kr/2/0/12699

저 질문에 답변하기 위한 배경 지식을 다룬 것입니다. ^^

그나저나, RuntimeType이 뭘까요? 사실, System.RuntimeType은 mscorlib.dll의 internal 타입이기 때문에 Microsoft의 도움말 문서 사이트에서도 찾아볼 수 없습니다. 대신, 검색해 보면 적절한 Q&A 글을 찾을 수 있습니다.

What's the difference between System.Type and System.RuntimeType in C#?
; https://stackoverflow.com/questions/5737840/whats-the-difference-between-system-type-and-system-runtimetype-in-c

System.Type이 abstract 타입인 것은 저도 처음 인지했군요. ^^; 결국 System.Type의 첫 구현 클래스가 System.RuntimeType이고 그렇다는 것은 곧, System.Type 유형의 인스턴스가 생성될 때마다 개체가 증가한다는 것을 짐작할 수 있습니다.

실제로 테스트를 해볼까요? 지난 글의 예제와 유사하게 구성해서,

using System;

class Program
{
    static void Main(string[] args)
    {
        Wait(1);

        Type type1 = typeof(MyRoot);
        Wait(2);

        Type type2 = typeof(MyType);
        Wait(3);
    }

    public static void Wait(int step)
    {
        Console.Write($"[{step}] Wait...");
        Console.ReadLine();
    }
}

public class MyRoot
{
    public object Ref;
}

class MyType
{
}

한 번씩 Wait을 할 때마다 "Take snapshot"을 찍고 비교하면 다음과 같이 RuntimeType 인스턴스가 생성된 것을 확인할 수 있습니다.

runtimeType_1.png

게다가 보는 바와 같이 (지난 예제에서는 재현이 안 되었던) Paths to Root까지도 뭔가 복잡하게 엮여 있는데요, 따라서 일단 내부적으로 특정 Type에 대해 (아마도 static처럼 한 번 생성이 되면) GC가 쉽게 되진 않을 듯합니다.

결국, RuntimeType 개체가 늘었다고 해서 뭔가 메모리 누수가 발생하는 것은 아니고 대개의 경우 Reflection이 많이 발생하는 작업, 예를 들어 IoC 프레임워크를 사용한다거나 하면 어쩔 수 없이 개체가 늘어나게 될 것입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/9/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-07-09 10시23분
[6598] 잘 읽었습니다. 감사합니다!
[guest]

... 166  167  168  169  170  171  172  173  174  175  176  177  [178]  179  180  ...
NoWriterDateCnt.TitleFile(s)
582정성태5/16/200826081오류 유형: 55. Windowless ActiveX controls are not supported
580정성태4/24/200825224VC++: 34. 64비트 윈도우즈에서의 이벤트 후킹
579정성태4/24/200824972VC++: 33. 변환 후의 RGS 파일 내용을 얻는 방법
577정성태4/16/200825971.NET Framework: 100. XML Serializer를 이용한 값 복사 [5]
575정성태4/7/200823153오류 유형: 54. TFS Source Control - 명령을 사용할 수 없음 [2]
574정성태3/31/200821335오류 유형: 53. TFS 연결 오류 - The workspace [...] exists on computer [...]
573정성태3/25/200825331Windows: 31. TS Web Access와 UAC [1]
570정성태3/17/200824435오류 유형: 52. TFS 연결 오류 - TF31001 [2]
569정성태3/16/200825560Team Foundation Server: 24. TFS 2008로 마이그레이션 (2) [2]
566정성태2/28/200826692.NET Framework: 99. AppDomain.GetEntryAssembly()를 우회하는 방법파일 다운로드1
564정성태2/16/200826373Windows: 30. TS Web Access + Vista SP1 [2]
563정성태2/16/200825699오류 유형: 51. Vista(UAC) + 웹 프로젝트 디버깅: System.UnauthorizedAccessException
562정성태2/12/200829989Windows: 29. Windows Server 2008 설치 [4]
561정성태1/10/200823658오류 유형: 50. IE 7 + 잘못된 HTC 파일 경로 = File not found [5]
559정성태1/1/200828470Windows: 28. Vista에서 끌어다 놓기로 GAC 등록하는 방법 [2]
558정성태1/1/200845542개발 환경 구성: 33. 32bit/64bit OLE DB Provider [1]
557정성태12/22/200723901개발 환경 구성: 32. WSCF와 VS.NET 2008
556정성태12/16/200722077기타: 22. 인기 순위 정리 : 조회수 1000 회 이상
555정성태12/16/200725016기타: 21. 인기 순위 정리 : 조회수 500 ~ 999회 글 목록
554정성태12/16/200729521기타: 20. 인기 순위 정리 : 조회수 250 ~ 499회 글 목록
553정성태12/16/200729925기타: 19. 인기 순위 정리 : 조회수 100 ~ 249회 글 목록
552정성태12/16/200723504기타: 18. 인기 순위 정리 : 조회수 000 ~ 099 회 글 목록
550정성태12/16/200722582Team Foundation Server: 23. TFS 2005에서 TFS 2008로 마이그레이션 [2]
549정성태12/16/200723949Team Foundation Server: 22. TFS 설정 - 주소를 도메인으로 변경
548정성태12/15/200741464오류 유형: 49. Report Server - 원격 서버에 연결할 수 없습니다
547정성태12/4/200729971.NET Framework: 98. .NET 비동기 Socket과 스레드
... 166  167  168  169  170  171  172  173  174  175  176  177  [178]  179  180  ...