.Net의 GC 쓰레기 회수 원리 및 실현

1. 먼저 필요한 지식 전제를 이해한다


메모리의 호스팅과 비호스팅은 다음과 같이 간단하게 이해할 수 있습니다.
관리: GC를 통해 메모리에서 방출되는 데이터 객체(이하 설명할 내용점)
관리되지 않음: IDisposable에서 리소스를 수동으로 방출해야 하는 객체
메모리에는 스택과 더미의 개념이 구분되어 있으며 간단한 설명만 있습니다.
창고: 선진 후출의 특징(여기는 더 이상 상세하게 설명하지 않음)
더미: 데이터 대상의 실례를 저장하는 메모리 공간 (이하 설명할 내용점)

2.Net GC에 대한 간단한 설명


GC 쓰레기 회수는 메모리 더미에 대한 처리 과정이다.
응용 프로그램 프로세스가 생성될 때, 이 응용 프로그램은 물리적 메모리 더미에 가상 연속적인 메모리 공간을 분배하여 응용 프로그램이 후속적으로 실행될 때 발생하는 데이터 대상의 실례를 저장합니다.
GC는 메모리 더미의 공간 분배와 방출을 자동으로 유지하는 독립적인 프로세스이다.그것은 하나 이상의 라인을 통해 쓰레기 회수를 하고, 기본적으로 백엔드 라인 쓰레기 회수를 사용합니다.(프론트 데스크 라인과 백그라운드 라인에 관해서는 다른 것을 참고할 수 있습니다)

셋.Net 플랫폼의 GC 쓰레기 수거는 언제 촉발될까요?


1. 할당된 무더기의 가상 메모리 공간이 충분하지 않을 때 시스템은 자동으로 할당된 가상 메모리 블록을 회수/압축/확대하여 새로 발생한 데이터 대상 저장에 적응한다.
2. 전체 물리적 메모리가 충분하지 않을 때 시스템은 각 프로세스가 차지하는 메모리 공간을 자동으로 회수/압축하여 새로 생성된 데이터 대상 저장에 적응한다.
3. 응용 프로그램에서 GC 회수를 수동으로 터치할 때 GC는 수동으로 지정한 방식에 따라 쓰레기 회수를 한다.

4. 작용역에서 더미 속의 세대를 이해한다


일단 이렇게 이해해주세요.
하나의 실례 변수가 성명할 때의 작용역이 비교적 크다고 가정하면 즉시 회수되지 않을 것이다. 왜냐하면 작용역이 큰 요소는 후속 프로그램이 자주 사용될 수 있기 때문이다.
하나의 실례 변수가 성명할 때의 작용역이 비교적 작다고 가정하면 우선적으로 회수될 수 있다. 왜냐하면 생존 주기가 비교적 짧고 작용역의 범위를 넘으면 이 변수는 다시 사용되지 않기 때문이다.
정적이거나 전역적인 작용역 변수를 가정하면, 이러한 전역 성명은 임의의 코드 세그먼트에서 장기적으로 사용되기 때문에 회수되지 않습니다.
따라서 더욱 좋은 회수를 위해 각 데이터 대상의 실례를 0세대, 1세대, 2세대로 귀납한다
0 세대: 임시 또는 최근에 생성된 데이터 객체 인스턴스입니다.가장 자주 회수되는 대상의 실례.
1세대: 한동안 다시 사용된 데이터 대상 실례, 생명주기가 긴 데이터 대상 실례.회수된 객체 인스턴스가 적습니다.
2세대: 상주 메모리의 대상 실례, 예를 들어 정적 유형, 전역 작용역 등 대상 실례.일반적으로 응용 프로그램이 종료된 후에 회수합니다.

5. 더미 속의 대상이 세대 간의 이동: 생존자의 향상


응용 프로그램이 계속 실행 중입니다.
새로 만든 대상은 먼저 0세대에 놓여 있으며, 일정 시간 운행한 후, 일부 변수는 자신이 있는 작용역을 초과하여 다시는 사용되지 않고 GC에 의해 정리된다.
일부 변수의 작용역이 커서 현재 자신이 있는 작용역을 초과하지 않고 다음에 사용될 수 있기 때문에 GC는 정리하지 않는다.
0세대에서 일부 데이터 대상의 실례는 GC에 의해 정리되고, 일부 데이터 실례의 대상은 GC에 의해 정리되지 않는다. 그러면 GC에 정리되지 않은 데이터 대상의 실례는 우리는 그것을 생존자라고 부른다.
이때 0세대 중 생존자는 1세대로 옮겨진다(위에서 1세대가 보관하고 있는 대상이 어떤 대상인지 생각해 봐...).
그렇다면 장기적으로/곳곳에서 사용되는 대상의 실례는 1세대에서 2세대로 옮겨진다.
따라서 2세대에 저장된 것은 정적 또는 전역적 역할 영역이나 장기적으로 사용되는 대상의 실례이다.

6. GC는 어떻게 정리할 대상의 실례를 확정합니까?


GC는 더미 속에서 각 대상 간의 구조도를 생성하여 회수 대상의 근거로 삼아 비활성 대상을 찾아낸다.
모든 데이터 대상 실례 간의 관련 인용 관계는 완전한 구조도를 생성한다. 구조도에 있지 않거나 역할 영역을 초과하거나 더 이상 사용되지 않는 일부 대상 실례는 비활성 대상이라고 부른다.GC가 정리할 대상으로 간주되다.
정확히 말하면
  • 창고 뿌리
  • 쓰레기 회수 손잡이
  • 정적 데이터
  • 7. 수동 GC 쓰레기 회수


    몇몇 흔치 않은 경우, 강제 회수는 응용 프로그램의 성능을 향상시킬 수 있다.여기서 GC를 사용할 수 있습니다.Collect 방법은 쓰레기 회수를 강제적으로 집행하여 쓰레기 회수를 유도한다.
    주의, 유도이지 즉각 회수하는 것이 아니다.
    응용 프로그램의 현재 안정적인 운행을 고려하여 GC를 실행합니다.Collect가 반드시 즉시 효과가 발생하는 것은 아니다. 여기는 단지 하나의 촉발일 뿐이다. 회수할 대상을 수집하고 회수 동작은 미래의 어느 적당한 시간대에 진행될 것이다.(물론 강제 저지식 회수도 가능합니다. 여기는 생략합니다.)
    (생각해 보세요: 쓸모없는 실례=null, GC를 회수 가능한 대상으로 알려 주시겠습니까? GC. Collect () 이후의 효과입니다.)
    GC 정보Collect 방법의 매개 변수는 위에서 언급한 개념과 장면에 사용됩니다.
  • 지정된 세대를 회수합니다
  • 회수 횟수를 지정합니다
  • 강제 회수 또는 선택기 회수
  • 막힌 회수 또는 백그라운드 라인 회수
  • 압축 또는 정리
  • (차단식 회수 방식: 모두 잠시 멈추고 먼저 회수하라)
    물론 일반적인 건의: 0대, 선택기, 백그라운드 회수(막힘식 위험이 너무 크므로 선택기 방식을 선택하고 구체적으로 자기 고려)

    8. 메모리 더미 중의 약한 인용


    응용 프로그램이 사용 중인 대상을 실행하면 GC는 회수할 수 없으며, 응용 프로그램이 이 대상에 대해 강한 인용을 가지고 있다고 여긴다.
    강제 참조: 응용 프로그램에서 사용 중인 객체 인스턴스는 GC에서 회수할 수 없습니다.
    약한 인용: 응용 프로그램이 잠시 사용하지 않은 대상의 실례, 일시적으로 GC에 의해 회수 가능한 실례로 정의될 수 있으며, 회수하기 전에 응용 프로그램에 의해 다시 사용된 후에 강한 인용이 될 수 있다.
    만약에 하나의 대상 실례가 GC에 정리된 후에 다음에 다시 사용된 장면을 가정하면 대상 실례를 다시 만들 것이다. 만약에 이 대상 실례가 비교적 크다면 이런 빈번한 창설은...
    물론 최적화된 공간이 있기 때문에 약한 인용은 상기 장면을 최적화시켰다.
    약한 인용의 장점: 빈번하게 만들어진 큰 실례에 대해 약한 유형은 한 번에 여러 번 만들어서 사용할 수 있고 큰 대상의 실례가 여러 번 만들어지는 성능 소모를 피할 수 있다.
    (작은 대상의 약한 유형 사용에 따른 대상 관리상의 성능 소모, 가치 여부)
    객체에 대한 약한 참조를 만들려면 추적할 객체 인스턴스를 사용하여 WeakReference를 만듭니다.그리고 Target 속성을 이 대상으로 설정하고 이 대상의 원본 인용을null로 설정합니다.(공식 문서 참조)
    즉, 어떤 대상의 실례를 일시적으로 GC 쓰레기에 회수되지 않도록 사용자 정의로 제어할 수 있다는 것이다.

    9. 공유 메모리를 많이 사용할 때 쓰레기 회수


    여러 개의 응용 프로그램이 한 호스트에서 동시에 실행될 때 메모리 공간의 크기에 대한 분배는 각 응용 프로그램이 메모리 이용에 대한 균형과 안정성을 달성하기 위해 유연하고 가변적인 것을 권장한다.
    gcTrimCommitOnLowMemory 설정을 사용하면 쓰레기 수거기는 시스템 메모리 부하를 계산하고 부하가 90%에 달할 때 수정 모드로 들어갑니다.부하가 85% 미만으로 떨어지지 않으면 계속 수정 모드에 있을 것입니다.
    만약 조건이 허락된다면, 쓰레기 수거기는 gcTrimCommitOnLowMemory 설정이 현재 응용에 도움이 되지 않고 무시될 수 있도록 결정할 수 있습니다.
    gcTrimCommitOnLowMemory 설정은 다음과 같습니다.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <runtime>
            <gcTrimCommitOnLowMemory enabled="true"/>
        </runtime>
    </configuration>
    이것에 관하여Net의 GC 쓰레기 회수 원리와 실현에 관한 글은 여기까지입니다.Net GC 쓰레기 수거 내용은 이전 글을 검색하거나 아래 관련 글을 계속 찾아보세요. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기