>  기사  >  백엔드 개발  >  .NET GC(가비지 수집) 원칙 분석

.NET GC(가비지 수집) 원칙 분석

怪我咯
怪我咯원래의
2017-04-05 13:33:441472검색

.NET 고급 콘텐츠의 일부로 가비지 컬렉터(줄여서 GC)를 꼭 이해해야 합니다. 이 기사에서는 "이해하기 쉽다"는 원칙에 따라 CLR의 가비지 수집기 작동 원리를 설명합니다.

기본 지식

관리되는 힙

먼저 MSDN의 설명을 살펴보겠습니다. 새 프로세스가 초기화되면 해당 프로세스를 위해 예약됩니다. 런타임 주소 공간의 연속 영역입니다. 이 예약된 주소 공간을 관리되는 힙이라고 합니다.

"관리되는 힙도 힙이다", 왜 이런 말을 하는 걸까요? 여러분이 "용어"로 인해 혼동하지 않기를 바라면서 이렇게 말씀드립니다. 이번 지식포인트의 전제는 "값형과 참조형의 차이"입니다. 여기서는 독자가 "값 유형은 스택에 저장되고, 참조 유형은 힙에 저장됩니다. (참조 유형의 참조는 스택에 저장됩니다.)"라는 중요한 개념을 이미 알고 있다고 가정합니다. 따라서 이 이론에 따르면 CLR에서는 값 형식을 제외한 모든 리소스를 관리되는 힙에서 할당해야 합니다.

관리되는 힙은 힙에서 다음 개체 의 할당 위치를 가리키는 NextObjPtr이라는 포인터를 유지 관리합니다.

CPU 레지스터

여기에서 검토하면 다음 "루트" 개념을 이해하는 데 도움이 됩니다.

CPU 레지스터는 CPU 고유의 "임시 메모리"로, 메모리 액세스보다 빠릅니다. CPU와의 거리를 기준으로 가장 가까운 것은 레지스터, 캐시(컴퓨터 레벨 1, 레벨 2, 레벨 3 캐시), 마지막으로 메모리입니다.

루트

클래스에 정의된 모든 정적 필드, 메소드 매개변수, 로컬 변수

(참조 유형 변수만 해당) 등 . 그것들은 모두 루트이며, CPU 레지스터의 객체 포인터도 루트입니다. 루트는 CLR이 힙 외부에서 찾을 수 있는 다양한 진입점입니다.

접속 가능 및 접속 불가 객체

루트가 힙의 객체를 참조하는 경우 해당 객체는 "접근 가능" "접근 가능"이고, 그렇지 않으면 " 도달할 수 없습니다."

가비지컬렉션의 이유

컴퓨터 구성의 관점에서 모든 프로그램은 메모리에 상주하고 실행되어야 한다. 그리고 메모리는 제한 요소(크기)입니다. 이 외에도 관리되는 힙에는 크기 제한도 있습니다. 관리되는 힙에 크기 제한이 없으면 C#

의 실행 속도가 c의 실행 속도보다 빠릅니다(관리되는 힙의 구조를 통해 c 런타임 힙보다 더 빠르게 개체를 할당할 수 있습니다). 주소 공간 및 저장소 제한으로 인해 관리되는 힙은 "메모리 오버플로" 없이 개체가 할당되도록 가비지 수집 메커니즘을 통해 정상적인 작동을 유지해야 합니다.

가비지 수집의 기본 원칙

재활용은 두 단계로 나뉩니다. 표시 -> 압축

표시 프로세스는 실제로 개체에 도달할 수 있는지 여부를 결정하는 프로세스입니다. 모든 루트가 검사되면 힙에는 도달 가능한(표시된) 객체와 도달할 수 없는(표시되지 않은) 객체가 포함됩니다.

마킹이 완료되면 압축단계로 들어갑니다. 이 단계에서 가비지 수집기는 힙을 선형적으로 탐색하여 연결할 수 없는 개체에 대한 연속 메모리 블록을 찾습니다. 그리고 도달 가능한 개체를 여기로 이동하여 힙을 압축합니다. 이 프로세스는 디스크 공간 조각 모음과 다소 유사합니다.

위 그림과 같이 녹색 상자는 도달 가능한 객체를 나타내고, 노란색 상자는 도달할 수 없는 객체를 나타냅니다. 도달할 수 없는 객체가 지워진 후 도달 가능한 객체를 이동하면 메모리 압축이 달성됩니다(더 컴팩트해짐).

압축 후 변수 및 CPU 레지스터 "이러한 개체에 대한 포인터"는 이제 유효하지 않으며 가비지 수집기는 모든 루트를 다시 방문하여 개체의 새 메모리 위치를 가리키도록 수정해야 합니다. 이로 인해 성능이 크게 저하될 수 있습니다. 이 손실은 관리되는 힙의 주요 단점이기도 합니다.

위의 특성을 바탕으로 가비지 수집으로 인한 재활용 알고리즘도 연구 주제입니다. 가비지 수집을 시작하기 전에 관리되는 힙이 가득 찰 때까지 기다리면 정말 "느리게" 되기 때문입니다.

가비지 수집 알고리즘 - 생성 알고리즘

생성은 CLR 가비지 수집기에서 사용하는 메커니즘의 유일한 목적은 애플리케이션의 성능을 향상시키는 것입니다. 세대별 재활용은 전체 힙을 재활용하는 것보다 분명히 빠릅니다.

CLR 관리형 힙은 0세대, 1세대, 2세대 등 3세대를 지원합니다. 0세대의 공간은 약 256KB, 1세대는 약 2M, 2세대는 약 10M 정도이다. 새로 생성된 객체는 0세대에 할당되며,

위 그림과 같이 0세대의 공간이 가득 차면 가비지 컬렉터가 재활용을 시작합니다.

도달할 수 없는 객체(위 그림의 C, E)는 재활용되며, 살아남은 객체는 1세대로 분류됩니다.

0세대의 공간이 꽉 차서 1세대의 공간이 닿을 수 없는 물체가 많아 공간이 거의 꽉 차게 되면 두 세대의 쓰레기는 모두 재활용됩니다. 살아남은 개체(연결 가능한 개체)의 경우 0세대는 1세대로 승격되고, 1세대는 2세대로 승격됩니다.

실제 CLR 생성 수집 메커니즘은 더 "지능적"입니다. 새로 생성된 개체의 수명 주기가 짧은 경우 0세대 가비지는 공간이 가득 찰 때까지 기다리지 않고 가비지 수집기에 의해 즉시 재활용됩니다. 할당됨). 또한, 0세대가 재활용되고 "접근 가능한" 개체가 여전히 많고

가 메모리를 많이 릴리스하지 않은 것으로 확인되면 0세대의 예산은 512KB로 증가하고 재활용 효과는 변환됨: 가비지 수집 횟수는 줄어들지만 매번 많은 양의 메모리가 회수됩니다. 메모리가 많이 해제되지 않은 경우 가비지 컬렉터는

전체 재활용(3세대)을 수행합니다. 그래도 충분하지 않으면 "메모리 오버플로" 예외가 발생합니다.

즉, 가비지 컬렉터는 복구된 메모리의 크기에 따라 각 세대의 할당된 공간 예산을 동적으로 조정합니다! 자동 최적화를 달성하세요!

요약

가비지 수집에는 기본 아이디어가 있습니다. 프로그래밍 언어 ​​(대부분)은 항상 무제한 메모리에 액세스할 수 있는 것 같습니다. 그리고 개발자는 마치 마법처럼 무궁무진하게 할당하고, 할당하고, 할당할 수 있습니다.

.NET 가비지 수집기의 기본 작동 원리는 다음과 같습니다. 가장 기본적인 표시 및 지우기 원리를 통해 도달할 수 없는 개체를 지운 다음 디스크 조각 모음과 같이 사용 가능한 메모리를 압축하고 구성하여 최종적으로 세대별 알고리즘 최적화를 통해 최고의 성능을 달성합니다. .

위 내용은 .NET GC(가비지 수집) 원칙 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.