Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 3개 있습니다.)
(시리즈 글이 4개 있습니다.)
.NET Framework: 435. .NET GC - 하위 세대의 객체를 포함하는 상위 세대의 참조를 추적하기 위한 card-table
; https://www.sysnet.pe.kr/2/0/1670

.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요?
; https://www.sysnet.pe.kr/2/0/1740

.NET Framework: 2005. C# - 생성한 참조 개체가 언제 GC의 정리 대상이 될까요?
; https://www.sysnet.pe.kr/2/0/13052

.NET Framework: 2006. C# - GC.KeepAlive 메서드의 역할
; https://www.sysnet.pe.kr/2/0/13053




.NET GC - 하위 세대의 객체를 포함하는 상위 세대의 참조를 추적하기 위한 card-table

GC의 동작 원리에 대해 쉽게 설명한 시리즈 글이 있어서 소개합니다. ^^

Back to basic: Series on dynamic memory management
; https://learn.microsoft.com/en-us/archive/blogs/abhinaba/back-to-basic-series-on-dynamic-memory-management

위의 글을 시작으로 현재 9개의 글이 쓰여졌는데 나름 재미있습니다.

  1. Memory allocation, a walk down the history
  2. Why use garbage collection
  3. Reference Counting Garbage Collection
  4. Mark-sweep garbage collection
  5. Copying garbage collection
  6. Optimizing reference counting garbage collection
  7. Handling overflow in mark stage
  8. Generational Garbage Collection
  9. How does the GC find object references

C# - 생성한 참조 개체가 언제 GC의 정리 대상이 될까요?
; https://www.sysnet.pe.kr/2/0/13052

이 중에서 Young 세대의 객체가 Old 세대의 객체에 할당된 경우, 그것을 추적하기 위한 방법을 설명한 "Generational Garbage Collection" 글을 읽으면서 확인하고 싶은 것이 생겼습니다.

위의 설명에 의하면, 아래와 같은 대입이 발생하는 경우 Card-table에 대한 액세스를 하기 위한 부가적인 호출이 JIT 컴파일러에 의해 삽입되어야 합니다. (글에 보면, .NET JITer가 그런 코드를 추가한다고 합니다.)

class Program
{
    public InnerType In;

    static void Main(string[] args)
    {
        Program pg = new Program();
        InnerType instance = new InnerType();

        pg.In = instance;
    }
}

class InnerType
{
}

실제로 그런지 어디 테스트 해볼까요? 비교를 위해 위의 코드를 다음과 같이 확장해 보겠습니다.

class Program
{
    public InnerType In;
    public int valueIn;

    static void Main(string[] args)
    {
        Program pg = new Program();

        InnerType stackVar = null;
        InnerType instance = new InnerType();
        InnerType stackInstance = new InnerType();

        pg.In = instance;

        pg.valueIn = 5;
        stackVar = stackInstance;
    }
}

class InnerType
{
}

"pg.valueIn = 5" 코드는 참조형이 아니기 때문에 card-table에 대한 액세스 코드가 없어야 합니다. 또한 "stackVar = stackInstance" 대입도 스택 변수에 할당되는 것이므로 역시 card-table 액세스 코드는 없어야 합니다.

이제 빌드하고, Visual Studio에서 Disassembly 창을 통해 확인해 보면? ^^

        pg.In = instance;
02B900E5  mov         edx,dword ptr [ebp-40h]  
02B900E8  mov         eax,dword ptr [ebp-48h]  
02B900EB  lea         edx,[edx+4]  
02B900EE  call    clr!JIT_WriteBarrierEAX (73711B70)

        pg.valueIn = 5;
02B900F3  mov         eax,dword ptr [ebp-40h]  
02B900F6  mov         dword ptr [eax+8],5  

        stackVar = stackInstance;
02B900FD  mov         eax,dword ptr [ebp-4Ch]  
02B90100  mov         dword ptr [ebp-44h],eax

정말 그렇군요. 아마도 저 호출이 card-table에 표시를 하기 위한 CLR 내부 코드로의 호출이지 않을까 예상해봅니다. 가끔, 관리 코드를 어셈블리 수준에서 디버깅하다 보면 저런 이상한 호출들이 끼워져 있는 것을 볼 수 있었는데, 이제야 그 원인을 이해하게 되었군요. ^^

간단한 테스트였지만... 역시나 '마법은 없다'는 것!




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/23/2022]

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

비밀번호

댓글 작성자
 




... 91  92  93  94  95  96  97  98  99  100  101  [102]  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11383정성태12/4/201723376디버깅 기술: 110. 비동기 코드 실행 중 예외로 인한 ASP.NET 프로세스 비정상 종료 현상 [1]
11382정성태12/4/201721919오류 유형: 436. System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired 예외 발생 시 "[Pre-Login] initialization=48; handshake=1944;" 값의 의미
11381정성태11/30/201718399.NET Framework: 702. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법(두 번째 이야기)파일 다운로드1
11380정성태11/30/201718431디버깅 기술: 109. windbg - (x64에서의 인자 값 추적을 이용한) Thread.Abort 시 대상이 되는 스레드를 식별하는 방법
11379정성태11/30/201719133오류 유형: 435. System.Web.HttpException - Session state has created a session id, but cannot save it because the response was already flushed by the application.
11378정성태11/29/201720599.NET Framework: 701. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법 [1]파일 다운로드1
11377정성태11/29/201719866.NET Framework: 700. CommonOpenFileDialog 사용 시 사용자가 선택한 파일 목록을 구하는 방법 [3]파일 다운로드1
11376정성태11/28/201724261VS.NET IDE: 123. Visual Studio 편집기의 \r\n (crlf) 개행을 \n으로 폴더 단위로 설정하는 방법
11375정성태11/28/201719047오류 유형: 434. Visual Studio로 ASP.NET 디버깅 중 System.Web.HttpException - Could not load type 오류
11374정성태11/27/201724142사물인터넷: 14. 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정 [1]
11373정성태11/27/201723129오류 유형: 433. Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
11372정성태11/25/201726130사물인터넷: 13. 윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법 [4]
11371정성태11/25/201719784오류 유형: 432. Hyper-V 가상 스위치 생성 시 Failed to connect Ethernet switch port 0x80070002 오류 발생
11370정성태11/25/201719797오류 유형: 431. Hyper-V의 Virtual Switch 생성 시 "External network" 목록에 특정 네트워크 어댑터 항목이 없는 경우
11369정성태11/25/201721764사물인터넷: 12. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠) [1]
11368정성태11/25/201727389.NET Framework: 699. UDP 브로드캐스트 주소 255.255.255.255와 192.168.0.255의 차이점과 이를 고려한 C# UDP 서버/클라이언트 예제 [2]파일 다운로드1
11367정성태11/25/201727474개발 환경 구성: 337. 윈도우 운영체제의 route 명령어 사용법
11366정성태11/25/201719125오류 유형: 430. 이벤트 로그 - Cryptographic Services failed while processing the OnIdentity() call in the System Writer Object.
11365정성태11/25/201721373오류 유형: 429. 이벤트 로그 - User Policy could not be updated successfully
11364정성태11/24/201723324사물인터넷: 11. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표) [2]
11363정성태11/23/201723312사물인터넷: 10. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법 (두 번째 이야기)
11362정성태11/22/201719738오류 유형: 428. 윈도우 업데이트 KB4048953 - 0x800705b4 [2]
11361정성태11/22/201722510오류 유형: 427. 이벤트 로그 - Filter Manager failed to attach to volume '\Device\HarddiskVolume??' 0xC03A001C
11360정성태11/22/201722383오류 유형: 426. 이벤트 로그 - The kernel power manager has initiated a shutdown transition.
11359정성태11/16/201721859오류 유형: 425. 윈도우 10 Version 1709 (OS Build 16299.64) 업그레이드 시 발생한 문제 2가지
11358정성태11/15/201726669사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작 [1]
... 91  92  93  94  95  96  97  98  99  100  101  [102]  103  104  105  ...