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

... 181  [182]  183  184  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
527정성태8/30/200734784Team Foundation Server: 20. 잠긴 파일을 강제로 해제 [2]
526정성태8/29/200724366오류 유형: 46. VS.NET 2008 - ASP.NET 디버깅 : Strong name validation failed.
525정성태8/27/200726600VS.NET IDE: 54. VS.NET 2008 - 새롭게 도입되는 XSD Schema Designer
524정성태8/23/200744273오류 유형: 45. 요청한 작업은, 사용자가 매핑한 구역이 열려 있는...
523정성태8/16/200726785VS.NET IDE: 53. VS.NET 2008 - 서비스 참조 시 기존 데이터 컨테이너 DLL 사용
522정성태8/13/200730383VS.NET IDE: 52. VS.NET 2008 - WCF를 위한 디버깅 환경 개선
521정성태8/8/200730079.NET Framework: 92. XmlSerializer 생성자의 실행 속도를 올리는 방법 - 두 번째 이야기 [3]
520정성태8/7/200725516VS.NET IDE: 51. Visual Studio 2008 베타 2 설치
519정성태7/27/200732028오류 유형: 44. System.BadImageFormatException [2]
518정성태7/26/200733318오류 유형: 43. System.ComponentModel.LicenseException [1]
517정성태7/19/200721294개발 환경 구성: 26. VPC - 일반 사용자 계정으로 구동
516정성태7/19/200724494오류 유형: 42. TFS - Error loading menu: Index was outside the bounds of the array [2]
515정성태7/18/200732657오류 유형: 41. SSL 서버 자격 증명을 만드는 동안 심각한 오류가 발생했습니다.
514정성태7/14/200725126Team Foundation Server: 19. Orcas에서 개선되는 TFS 기능들
513정성태7/4/200736406.NET Framework: 91. Foreground Thread / Background Thread [1]
512정성태6/27/200725510오류 유형: 40. error PRJ0050: Failed to register output.
511정성태6/25/200734034.NET Framework: 90. XmlSerializer 생성자의 실행 속도를 올리는 방법 [2]
510정성태6/25/200749388디버깅 기술: 15. First-Chance Exception
508정성태6/21/200732014Team Foundation Server: 18. Team Build에 사용되는 각종 Property 값 [4]
507정성태6/11/200729546VS.NET IDE: 50. Orcas - UAC 설정 관련
506정성태6/9/200724165오류 유형: 39. VC Package not available or not registered
505정성태6/9/200724016오류 유형: 38. Visual SourceSafe - DB 잠김 오류
504정성태6/9/200729279오류 유형: 37. Visual SourceSafe - Anaylze 도중 비정상 종료
503정성태6/7/200731998VS.NET IDE: 49. Orcas - VC++ 다중 소스 동시 컴파일 옵션: /MP
502정성태6/7/200726887VS.NET IDE: 48. Orcas - VC++ 프로젝트 마이그레이션
500정성태6/4/200736120VS.NET IDE: 47. Orcas - Web Browser Debugger를 이용한 보호 모드의 ActiveX 컨트롤 디버깅
... 181  [182]  183  184  185  186  187  188  189  190  191  192  193  194  195  ...