집 >백엔드 개발 >C#.Net 튜토리얼 >.NET GC(가비지 수집) 원칙 분석
.NET 고급 콘텐츠의 일부로 가비지 컬렉터(줄여서 GC)를 꼭 이해해야 합니다. 이 기사에서는 "이해하기 쉽다"는 원칙에 따라 CLR의 가비지 수집기 작동 원리를 설명합니다.
먼저 MSDN의 설명을 살펴보겠습니다. 새 프로세스가 초기화되면 해당 프로세스를 위해 예약됩니다. 런타임 주소 공간의 연속 영역입니다. 이 예약된 주소 공간을 관리되는 힙이라고 합니다.
"관리되는 힙도 힙이다", 왜 이런 말을 하는 걸까요? 여러분이 "용어"로 인해 혼동하지 않기를 바라면서 이렇게 말씀드립니다. 이번 지식포인트의 전제는 "값형과 참조형의 차이"입니다. 여기서는 독자가 "값 유형은 스택에 저장되고, 참조 유형은 힙에 저장됩니다. (참조 유형의 참조는 스택에 저장됩니다.)"라는 중요한 개념을 이미 알고 있다고 가정합니다. 따라서 이 이론에 따르면 CLR에서는 값 형식을 제외한 모든 리소스를 관리되는 힙에서 할당해야 합니다.
관리되는 힙은 힙에서 다음 개체 의 할당 위치를 가리키는 NextObjPtr이라는 포인터를 유지 관리합니다.
여기에서 검토하면 다음 "루트" 개념을 이해하는 데 도움이 됩니다.
CPU 레지스터는 CPU 고유의 "임시 메모리"로, 메모리 액세스보다 빠릅니다. CPU와의 거리를 기준으로 가장 가까운 것은 레지스터, 캐시(컴퓨터 레벨 1, 레벨 2, 레벨 3 캐시), 마지막으로 메모리입니다.
클래스에 정의된 모든 정적 필드, 메소드 매개변수, 로컬 변수
(참조 유형 변수만 해당) 등 . 그것들은 모두 루트이며, CPU 레지스터의 객체 포인터도 루트입니다. 루트는 CLR이 힙 외부에서 찾을 수 있는 다양한 진입점입니다.위 그림과 같이 0세대의 공간이 가득 차면 가비지 컬렉터가 재활용을 시작합니다.
도달할 수 없는 객체(위 그림의 C, E)는 재활용되며, 살아남은 객체는 1세대로 분류됩니다.0세대의 공간이 꽉 차서 1세대의 공간이 닿을 수 없는 물체가 많아 공간이 거의 꽉 차게 되면 두 세대의 쓰레기는 모두 재활용됩니다. 살아남은 개체(연결 가능한 개체)의 경우 0세대는 1세대로 승격되고, 1세대는 2세대로 승격됩니다.
실제 CLR 생성 수집 메커니즘은 더 "지능적"입니다. 새로 생성된 개체의 수명 주기가 짧은 경우 0세대 가비지는 공간이 가득 찰 때까지 기다리지 않고 가비지 수집기에 의해 즉시 재활용됩니다. 할당됨). 또한, 0세대가 재활용되고 "접근 가능한" 개체가 여전히 많고
가 메모리를 많이 릴리스하지 않은 것으로 확인되면 0세대의 예산은 512KB로 증가하고 재활용 효과는 변환됨: 가비지 수집 횟수는 줄어들지만 매번 많은 양의 메모리가 회수됩니다. 메모리가 많이 해제되지 않은 경우 가비지 컬렉터는
전체 재활용(3세대)을 수행합니다. 그래도 충분하지 않으면 "메모리 오버플로" 예외가 발생합니다.
즉, 가비지 컬렉터는 복구된 메모리의 크기에 따라 각 세대의 할당된 공간 예산을 동적으로 조정합니다! 자동 최적화를 달성하세요!
가비지 수집에는 기본 아이디어가 있습니다. 프로그래밍 언어 (대부분)은 항상 무제한 메모리에 액세스할 수 있는 것 같습니다. 그리고 개발자는 마치 마법처럼 무궁무진하게 할당하고, 할당하고, 할당할 수 있습니다.
.NET 가비지 수집기의 기본 작동 원리는 다음과 같습니다. 가장 기본적인 표시 및 지우기 원리를 통해 도달할 수 없는 개체를 지운 다음 디스크 조각 모음과 같이 사용 가능한 메모리를 압축하고 구성하여 최종적으로 세대별 알고리즘 최적화를 통해 최고의 성능을 달성합니다. .
위 내용은 .NET GC(가비지 수집) 원칙 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!