Microsoft MVP성태의 닷넷 이야기
.NET Framework: 741. windbg로 확인하는 객체의 GC 여부 [링크 복사], [링크+제목 복사],
조회: 23218
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

windbg로 확인하는 객체의 GC 여부

객체가 GC되었는지 어떻게 알 수 있을까요? 테스트를 위해 다음과 같이 간단하게 프로그램을 만들고,

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Instance();

            Console.ReadLine();    // .NET 4 + x86 + Release 모드로 실행 후,
                                   // 이 시점에 Dump를 뜨고,

            GC.Collect(2, GCCollectionMode.Forced);     // 엔터를 치면 GC가 수행되고,
                                                        // 이 시점에 다시 Dump를 뜸
            Console.ReadLine();
        }

        private static void Instance()
        {
            Program pg = new Program();
        }
    }
}

두 번의 덤프를 떠 보면 됩니다. 첫 번째 덤프는 Instance 메서드 내에서 생성한 pg 객체가 범위를 벗어났지만 아직 Garbage Collector가 실행된 적이 없으므로 GC Heap에 객체가 있을 것입니다. 반면 두 번째 덤프를 뜬 시기에는 강제로 GC.Collect를 호출했으므로 0세대 GC Heap에 있던 pg 객체가 없어졌을 것입니다.

실제로 그런지 덤프 파일을 windbg로 확인해 볼까요? ^^

첫 번째 덤프 파일을 열고, ConsoleApp2.Program 객체가 GC Heap에 있는지 다음과 같이 확인할 수 있습니다.

0:000> .loadby sos clr

0:000> !dumpheap -type ConsoleApp2.Program
 Address       MT     Size
04b4242c 02c34d34       12     

Statistics:
      MT    Count    TotalSize Class Name
02c34d34        1           12 ConsoleApp2.Program
Total 1 objects

이때의 GC heap을 구해 보면,

0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x04b41018
generation 1 starts at 0x04b4100c
generation 2 starts at 0x04b41000
ephemeral segment allocation context: none
 segment     begin  allocated      size
04b40000  04b41000  04b45ff4  0x4ff4(20468)
Large object heap starts at 0x05b41000
 segment     begin  allocated      size
05b40000  05b41000  05b45508  0x4508(17672)
Total Size:              Size: 0x94fc (38140) bytes.
------------------------------
GC Heap Size:    Size: 0x94fc (38140) bytes.

0 세대 힙의 시작 위치가 0x04b41018이고, pg 객체의 메모리 주소가 04b4242c이므로 0 세대 힙에 위치한 것이 맞는다는 것을 알 수 있습니다.

그다음, GC.Collect 이후의 덤프로 "!dumpheap -type ConsoleApp2.Program" 명령을 내리면 예상했던 데로 객체가 없습니다.

0:000> !dumpheap -type ConsoleApp2.Program
 Address       MT     Size

Statistics:
      MT    Count    TotalSize Class Name
Total 0 objects

GC 힙의 상황을 보면,

0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x04b44300
generation 1 starts at 0x04b4100c
generation 2 starts at 0x04b41000
ephemeral segment allocation context: none
 segment     begin  allocated      size
04b40000  04b41000  04b4430c  0x330c(13068)
Large object heap starts at 0x05b41000
 segment     begin  allocated      size
05b40000  05b41000  05b45508  0x4508(17672)
Total Size:              Size: 0x7814 (30740) bytes.
------------------------------
GC Heap Size:    Size: 0x7814 (30740) bytes.

pg 객체가 있던 04b4242c 주소를 넘어서 0 세대 힙의 시작 주소가 0x04b44300로 설정된 것을 볼 수 있습니다. 만약, GC되지 않았다면 (승격되었을 것이므로) 1 세대 힙의 시작 주소인 0x04b4100c와 0 세대 힙의 시작 주소 사이에 객체의 주소가 출력되었을 것입니다.




객체가 해제되었는지 덤프를 통해 확인하는 것은 사실 좀 번거로운 작업입니다. 다행히 이보다 더 쉬운 방법이 있는데 바로 WeakReference를 사용하는 것입니다. 이를 통해 예제 코드를 다음과 같이 바꿔서 windbg 없이도 해당 객체가 GC되었는지를 알 수 있습니다.

using System;

namespace ConsoleApp2
{
    class Program
    {
        static WeakReference _wr;

        static void Main(string[] args)
        {
            Instance();
            Console.WriteLine(_wr.IsAlive); // IsAlive == True
            Console.ReadLine();

            GC.Collect(2, GCCollectionMode.Forced);
            Console.WriteLine(_wr.IsAlive); // IsAlive == False
            Console.ReadLine();
        }

        private static void Instance()
        {
            Program pg = new Program();
            _wr = new WeakReference(pg);
        }
    }
}

간단하죠? ^^




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/28/2018]

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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  114  115  116  [117]  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11106정성태11/8/201630352.NET Framework: 623. C# - PeerFinder를 이용한 Wi-Fi Direct 데이터 통신 예제 [2]파일 다운로드1
11105정성태11/8/201625690.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제
11104정성태11/8/201623741개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제
11103정성태11/8/201624825오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생
11102정성태11/8/201625191오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생
11101정성태11/8/201626356.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363
11100정성태11/7/201635060개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]
11099정성태11/7/201636553.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드파일 다운로드1
11098정성태11/7/201625833오류 유형: 368. 빌드 이벤트에서 robocopy 사용 시 $(TargetDir) 매크로를 지정하는 경우 오류 발생
11097정성태11/7/201628119오류 유형: 367. go install: no install location for directory [...경로...] outside GOPATH
11096정성태11/6/201631144디버깅 기술: 83. PDB 파일을 수동으로 다운로드하는 방법
11095정성태11/6/201628820.NET Framework: 619. C# - Cognitive Services 중의 하나인 Face API를 사용해 얼굴 인식 및 흐림(blur) 효과 적용 [1]파일 다운로드1
11094정성태11/5/201629814VC++: 105. Visual Studio 2013/2015 - Ceemple OpenCV 확장을 이용한 웹캠 영상 출력
11093정성태11/4/201630130웹: 34. Edge 브라우저도 지원하는 클립보드 복사를 위한 자바스크립트 코드
11092정성태11/3/201637469.NET Framework: 618. C# - NAudio를 이용한 MP3 파일 재생 [5]파일 다운로드1
11091정성태11/3/201629886VC++: 104. std::call_once를 이용해 thread-safe한 Singleton 객체 생성파일 다운로드1
11090정성태11/1/201631530VC++: 103. C++ CreateTimerQueue, CreateTimerQueueTimer 예제 코드 [9]파일 다운로드1
11089정성태11/1/201632449디버깅 기술: 82. Windows 10을 위한 Symbol(PDB) 파일 내려받는 방법 [2]
11088정성태11/1/201634195.NET Framework: 617. C# - AForge.NET을 이용한 MP4 동영상 파일 재생 [7]파일 다운로드1
11087정성태11/1/201628730.NET Framework: 616. AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법파일 다운로드1
11086정성태11/1/201623328오류 유형: 366. The Microsoft Passport Container service terminated with the following error: General access denied error
11085정성태10/27/201638775.NET Framework: 615. C# - AForge.NET을 이용한 웹캠 영상 출력 [2]파일 다운로드1
11084정성태10/26/201626332오류 유형: 365. The User Profile Service service failed to the sign-in.
11083정성태10/26/201632870Windows: 131. 윈도우 10에서 사라진 "Adapters and Bindings" 네트워크 우선 순위 조정 기능 [1]
11082정성태10/26/201636121.NET Framework: 614. C# - DateTime.Ticks의 정밀도 [4]파일 다운로드1
11081정성태10/26/201625095오류 유형: 364. You need to fix your Microsoft Account for apps on your other devices to be able to launch apps and continue experiences on this device.
... 106  107  108  109  110  111  112  113  114  115  116  [117]  118  119  120  ...