Microsoft MVP성태의 닷넷 이야기
.NET Framework: 1074. RuntimeType의 메모리 누수? [링크 복사], [링크+제목 복사],
조회: 17263
글쓴 사람
정성태 (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]

... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10848정성태9/8/201527385VS.NET IDE: 103. Visual Studio의 Ctrl + F5 실행 동작파일 다운로드1
10847정성태9/8/201523464VS.NET IDE: 102. 목록(List) 타입의 값을 디버깅 중 Watch 창에서 확인하는 방법 [1]파일 다운로드1
10846정성태9/8/201520838오류 유형: 306. "query user" 명령어에 공백 문자가 포함된 계정을 전달하는 경우
10845정성태9/3/201521920오류 유형: 305. 윈도우 백업 시 오류 - 0x80780166
10844정성태9/2/201523132.NET Framework: 528. C# - 상호 참조하는 경우의 정적 생성자 동작 방식 [4]파일 다운로드1
10843정성태9/1/201523857VS.NET IDE: 101. Visual Studio 2015의 솔루션 탐색기가 클래스 뷰 정보로 인해 느려지는 현상
10842정성태9/1/201520892.NET Framework: 527. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 세 번째 이야기
10841정성태8/31/201530208개발 환경 구성: 276. Visual Studio 2013에서 C# 6과 닷넷 4.6 기능을 사용하려면?
10839정성태8/22/201528787Windows: 112. 윈도우 10에서 터치 키보드를 안 뜨게 할 수 있는 방법 [4]
10838정성태8/22/201539072오류 유형: 304. Windows 10에서 VPN 연결이 실패한다면? [3]
10837정성태8/21/201519357오류 유형: 303. Your computer is low on memory. Save your files and close these programs...
10836정성태8/21/201520317오류 유형: 302. 설치 파일 실행 시 "This app can't run on your PC" 오류가 뜬다면?
10835정성태8/21/201528815웹: 31. Microsoft Edge 브라우저를 명령행에서 띄우는 방법 [1]
10834정성태8/19/201520912.NET Framework: 526. 닷넷 - 값 형식을 new 없이 생성하면 0으로 초기화되지 않는다?
10833정성태8/18/201525549.NET Framework: 525. C# - 닷넷에서 프로세스가 열고 있는 파일 목록을 구하는 방법파일 다운로드1
10832정성태8/17/201529947디버깅 기술: 74. x64 콜 스택 인자 추적과 windbg의 Child-SP, RetAddr, Args to Child 값 확인 [8]파일 다운로드2
10831정성태8/13/201529931.NET Framework: 524. .NET 4.0과 .NET 4.5의 컴파일 결과 차이점 [1]파일 다운로드1
10830정성태8/12/201523930개발 환경 구성: 275. Web.config이 적용되지 않는 프로젝트에서 Razor 템플릿 파일의 C# 컴파일러 버전 제어 [1]
10829정성태8/10/201526005개발 환경 구성: 274. PowerShell/명령행에서 JDK/JRE를 무인(unattended)/자동 설치를 하는 방법 [3]
10828정성태8/10/201531621웹: 30. Edge 브라우저에서 "이 웹 사이트에는 Internet Explorer가 필요함" 단계를 없애는 방법 [1]
10827정성태7/8/201532981개발 환경 구성: 273. Visual Studio 2015에서 Github와 연동하는 방법 [3]
10826정성태7/8/201522603오류 유형: 301. The trust relationship between this workstation and the primary domain failed. - 두 번째 이야기
10825정성태7/8/201522166개발 환경 구성: 272. Visual Studio IDE 설치 없이 Visual Studio SDK 설치하는 방법
10824정성태7/7/201527354개발 환경 구성: 271. Team Foundation Server 2015 설치 방법 [1]
10823정성태7/7/201527906오류 유형: 300. SqlException (0x80131904): Unable to open the physical file
10822정성태7/7/201527265오류 유형: 299. The 'Visual C++ Project System Package' package did not load correctly.
... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...