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

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12211정성태4/27/202019299개발 환경 구성: 486. WSL에서 Makefile로 공개된 리눅스 환경의 C/C++ 소스 코드 빌드
12210정성태4/20/202020772.NET Framework: 903. .NET Framework의 Strong-named 어셈블리 바인딩 (1) - app.config을 이용한 바인딩 리디렉션 [1]파일 다운로드1
12209정성태4/13/202017453오류 유형: 614. 리눅스 환경에서 C/C++ 프로그램이 Segmentation fault 에러가 발생한 경우 (2)
12208정성태4/12/202016027Linux: 29. 리눅스 환경에서 C/C++ 프로그램이 Segmentation fault 에러가 발생한 경우
12207정성태4/2/202015907스크립트: 19. Windows PowerShell의 NonInteractive 모드
12206정성태4/2/202018515오류 유형: 613. 파일 잠금이 바로 안 풀린다면? - The process cannot access the file '...' because it is being used by another process.
12205정성태4/2/202015129스크립트: 18. Powershell에서는 cmd.exe의 명령어를 지원하진 않습니다.
12204정성태4/1/202015157스크립트: 17. Powershell 명령어에 ';' (semi-colon) 문자가 포함된 경우
12203정성태3/18/202018013오류 유형: 612. warning: 'C:\ProgramData/Git/config' has a dubious owner: '...'.
12202정성태3/18/202021237개발 환경 구성: 486. .NET Framework 프로젝트를 위한 GitLab CI/CD Runner 구성
12201정성태3/18/202018483오류 유형: 611. git-credential-manager.exe: Using credentials for username "Personal Access Token". [1]
12200정성태3/18/202018568VS.NET IDE: 145. NuGet + Github 라이브러리 디버깅 관련 옵션 3가지 - "Enable Just My Code" / "Enable Source Link support" / "Suppress JIT optimization on module load (Managed only)"
12199정성태3/17/202016215오류 유형: 610. C# - CodeDomProvider 사용 시 Unhandled Exception: System.IO.DirectoryNotFoundException: Could not find a part of the path '...\f2_6uod0.tmp'.
12198정성태3/17/202019582오류 유형: 609. SQL 서버 접속 시 "Cannot open user default database. Login failed."
12197정성태3/17/202018920VS.NET IDE: 144. .NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성 - 두 번째 이야기 [1]
12196정성태3/17/202016021오류 유형: 608. The ServicedComponent being invoked is not correctly configured (Use regsvcs to re-register).
12195정성태3/16/202018326.NET Framework: 902. C# - 프로세스의 모든 핸들을 열람 - 세 번째 이야기
12194정성태3/16/202021035오류 유형: 607. PostgreSQL - Npgsql.NpgsqlException: sorry, too many clients already
12193정성태3/16/202018007개발 환경 구성: 485. docker - SAP Adaptive Server Enterprise 컨테이너 실행 [1]
12192정성태3/14/202020042개발 환경 구성: 484. docker - Sybase Anywhere 16 컨테이너 실행
12191정성태3/14/202021097개발 환경 구성: 483. docker - OracleXE 컨테이너 실행 [1]
12190정성태3/14/202015709오류 유형: 606. Docker Desktop 업그레이드 시 "The process cannot access the file 'C:\Program Files\Docker\Docker\resources\dockerd.exe' because it is being used by another process."
12189정성태3/13/202021310개발 환경 구성: 482. Facebook OAuth 처리 시 상태 정보 전달 방법과 "유효한 OAuth 리디렉션 URI" 설정 규칙
12188정성태3/13/202026073Windows: 169. 부팅 시점에 실행되는 chkdsk 결과를 확인하는 방법
12187정성태3/12/202015681오류 유형: 605. NtpClient was unable to set a manual peer to use as a time source because of duplicate error on '...'.
12186정성태3/12/202017450오류 유형: 604. The SysVol Permissions for one or more GPOs on this domain controller and not in sync with the permissions for the GPOs on the Baseline domain controller.
... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...