> 백엔드 개발 > Golang > Go 언어에는 가비지 수집 기능이 있나요?

Go 언어에는 가비지 수집 기능이 있나요?

青灯夜游
풀어 주다: 2022-12-09 19:42:38
원래의
7060명이 탐색했습니다.

Go 언어에는 가비지 컬렉션이 있습니다. Go 언어에는 GC(가비지 수집 메커니즘)가 포함되어 있으며 더 이상 사용되지 않는 변수를 검색하여 해제하는 별도의 프로세스를 통해 실행됩니다. 계산 중. 메모리 공간에는 두 가지 중요한 영역이 포함됩니다. 스택 영역(Stack)과 힙 영역(Heap)은 일반적으로 함수 호출의 매개변수, 반환 값 및 로컬 변수를 저장하고 메모리 조각화를 생성하지 않으며 관리됩니다. 컴파일러이며 개발이 필요하지 않습니다. 힙 영역은 메모리 조각을 생성합니다. Go 언어에서 힙 영역의 개체는 메모리 할당자에 의해 할당되고 가비지 수집기에 의해 재활용됩니다.

Go 언어에는 가비지 수집 기능이 있나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go 언어에는 자체 GC(가비지 수집 메커니즘)가 있습니다. GC는 더 이상 사용되지 않는 변수를 검색하여 해제하는 별도의 프로세스로 수행됩니다. GC가 실행될 때 머신 리소스를 차지한다는 점에 유의해야 합니다.

Go 언어의 가비지 수집 메커니즘인 GC에 대한 자세한 설명

컴퓨터 과학에서 가비지 수집(GC)은 자동 메모리 관리 메커니즘으로, 더 이상 사용되지 않는 프로그램을 재활용하려고 합니다. 객체 및 점유 메모리

프로그래머는 GC에 대해 걱정할 필요가 없으며 더 이상 프로그램이 거의 보이지 않을 때 남은 메모리를 자동으로 해제할 필요가 없습니다. 프로그래머에게는 프로그램에 특별한 최적화가 필요한 경우에만 제어 가능한 API를 제공하여 GC의 실행 타이밍과 실행 오버헤드를 제어할 수 있습니다.

컴퓨팅에서 메모리 공간에는 두 가지 중요한 영역이 있습니다: 스택 영역(Stack) 힙 영역(Heap)은 일반적으로 함수 호출의 매개변수, 반환 값 및 로컬 변수를 저장하고 메모리 조각화를 생성하지 않으며 컴파일러에 의해 관리되며 힙 영역은 개발자 관리가 필요하지 않습니다. Go 언어에서 힙 영역의 개체는 메모리 할당자에 의해 할당되고 가비지 수집기에 의해 재활용됩니다. [관련 권장 사항:

Go 비디오 튜토리얼, 프로그래밍 교육]

일반적으로 가비지 컬렉터의 실행 프로세스는 두 개의 반독립적인 구성 요소로 나뉩니다.

    사용자 프로그램(Mutator): 사용자 모드 코드, GC용 즉, 사용자 모드 코드는 객체 간의 참조 관계만 수정합니다.
  • 컬렉터(Collector): 가비지 컬렉션 수행을 담당하는 코드

1. 메모리 관리 및 할당

메모리가 더 이상 사용할 수 없습니다. 사용하면 Go 메모리 관리가 표준 라이브러리에 의해 자동으로 수행됩니다. 즉, Go 컬렉션에 메모리를 할당합니다. 메모리 관리에는 일반적으로 사용자 프로그램(Mutator), 할당자(Allocator) 및 수집기(Collector)라는 세 가지 구성 요소가 포함됩니다. 사용자 프로그램이 메모리를 신청할 때 메모리 할당자와 할당자를 통해 새 메모리를 적용합니다. 힙에서 해당 메모리 영역을 초기화하는 일을 담당합니다

Go 언어에는 가비지 수집 기능이 있나요?

1.1 메모리 할당자의 할당 방법

프로그래밍 언어에서 메모리 할당자는 일반적으로 두 가지 할당 방법을 사용합니다.

  • 선형 할당자(순차 할당자) , Bump Allocator)

  • Free-List Allocator(Free-List Allocator)

Linear Allocator

Linear Allocator(Bump Allocator)는 효율적인 메모리 할당 방법이지만 몇 가지 단점과 큰 한계가 있습니다. 사용자가 선형 할당자를 사용하는 경우 메모리의 특정 메모리 위치에 대한 포인터만 유지하면 됩니다. 사용자 프로그램이 할당자에서 메모리를 적용하는 경우 할당자는 남은 여유 메모리만 확인하고 할당된 메모리를 반환하면 됩니다.

선형 할당자는 실행 속도가 더 빠르고 구현 복잡성이 낮지만 메모리가 해제된 후에는 메모리를 재사용할 수 없습니다. 아래와 같이 할당된 메모리를 재활용하면 선형 할당자는 레드 메모리를 재사용할 수 없습니다

Go 언어에는 가비지 수집 기능이 있나요?

따라서 선형 할당자는 적합한 가비지 수집 알고리즘과 함께 사용해야 합니다

  • Mark-Compact

  • Copying GC

  • Generational GC

위 알고리즘은 복사를 통해 살아남은 객체의 조각 모음을 수행할 수 있으며, 여유 메모리를 정기적으로 병합하여 선형 할당자를 사용할 수 있도록 효율성을 높여 메모리 할당자의 성능을 향상시킵니다

Free-List Allocator

Free-List Allocator(Free-List Allocator)는 해제된 메모리를 재사용할 수 있으며 내부적으로 연결 목록과 유사한 데이터 구조를 유지합니다. 사용자 프로그램이 메모리를 적용하면 무료 연결 목록 할당자는 충분한 크기의 메모리를 찾기 위해 사용 가능한 메모리 블록을 순회한 다음 새 리소스를 적용하고 연결 목록을 수정합니다

Go 언어에는 가비지 수집 기능이 있나요?

무료 연결 목록 할당자에는 네 가지 일반적인 전략이 있습니다.

  • 첫 번째 맞춤 - 연결 목록의 헤드에서 탐색하여 요청된 메모리보다 크기가 큰 첫 번째 메모리 블록을 선택합니다.
  • 루프 첫 맞춤 (Next-Fit) — 마지막 순회 끝 위치부터 순회하여 요청된 메모리보다 크기가 큰 첫 번째 메모리 블록을 선택합니다. Best-Fit(Best-Fit) — 연결 리스트의 선두부터 전체를 순회합니다. 연결 리스트를 선택하고 가장 적합한 메모리 블록을 선택합니다. Segregated-Fit — 메모리를 여러 개의 연결 리스트로 나눕니다. 각 연결 리스트의 메모리 블록은 동일한 크기입니다. 메모리 신청 시 먼저 조건에 맞는 연결 리스트를 찾습니다. , 그런 다음 연결된 목록에서 적절한 메모리 블록을 선택합니다
  • 4-in-1 전략은 Go 언어에서 사용되는 메모리 할당 전략과 유사합니다

이 전략은 메모리를 연결된 목록으로 나눕니다. 4, 8, 16, 32바이트 메모리 블록으로 구성됩니다. 메모리 할당자 Bytes of memory에서 8개를 적용하면 위 그림의 조건을 충족하는 여유 메모리 블록을 찾아서 반환됩니다. 격리 적응의 할당 전략은 탐색해야 하는 메모리 블록 수를 줄이고 메모리 할당 효율성을 향상시킵니다

Go 언어에는 가비지 수집 기능이 있나요?

1.2 Go의 메모리 할당

그림은 메모리 할당의 구성을 보여줍니다.

Go 언어에서는 힙에 있는 모든 객체가

runtime.newobjectGo 언어에는 가비지 수집 기능이 있나요? 함수를 호출하여 메모리를 할당합니다. 이 함수는

runtime.mallocgc

를 호출하여 지정된 크기의 메모리 공간을 할당합니다. 이는 사용자에게 필요한 기능이기도 합니다. 힙에 메모리 공간을 적용하는 프로그램

runtime.mallocgc가 객체의 크기에 따라 서로 다른 할당 로직을 수행하고, 이를 작은 객체로 나누는 코드를 보면 알 수 있습니다. 개체 크기에 따른 개체 및 대형 개체

마이크로 개체 (0, 16B) — 먼저 마이크로 할당자를 사용한 다음 스레드 캐시, 중앙 캐시 및 메모리 할당을 위한 힙

runtime.mallocgc 根据对象的大小执行不同的分配逻辑,根据对象大小将它们分成微对象、小对象和大对象

  • 微对象 (0, 16B) — 先使用微型分配器,再依次尝试线程缓存、中心缓存和堆分配内存
  • 小对象 [16B, 32KB] — 依次尝试使用线程缓存、中心缓存和堆分配内存
  • 大对象 (32KB, +∞) — 直接在堆上分配内存

Go 언어에는 가비지 수집 기능이 있나요?

小分配

对于小于 32kb 的小分配,Go 会尝试从 mcache 的本地缓存中获取内存,该缓存处理一个跨度列表 (32kb 的内存块) mspan

Go 언어에는 가비지 수집 기능이 있나요?

每个线程 M 都分配给一个处理器 P,一次最多处理一个 goroutine。在分配内存时,当前的 goroutine 将使用其当前的本地缓存 P 来查找 span소형 개체 [16B, 32KB] — 스레드 캐시를 차례로 사용하고 중앙 캐시와 힙에 할당된 메모리

대형 개체 (32KB, +) — 힙에 직접 메모리 할당<strong></strong>

Go 언어에는 가비지 수집 기능이 있나요?

소규모 할당Go 언어에는 가비지 수집 기능이 있나요?

32kb 미만의 소규모 할당의 경우 Go는 범위 목록을 처리하는 mcache에서 시작하려고 시도합니다. (32kb 메모리 블록) mspanGo 언어에는 가비지 수집 기능이 있나요?각 스레드 M은 프로세서 P에 할당되며, 한 번에 최대 하나씩goroutine 처리할 수 있습니다. 메모리를 할당할 때 현재 goroutine은 현재 로컬 캐시 P를 사용하여 span 목록에서 사용 가능한 첫 번째 자유 개체를 찾습니다.

Big Allocation

Go는 그렇지 않습니다. 대규모 할당을 관리하려면 로컬 캐시를 사용하세요. 32kb보다 큰 할당은 페이지 크기로 반올림되어 페이지가 힙에 직접 할당됩니다.

Go 언어에는 가비지 수집 기능이 있나요?

2. 가비지 컬렉션

Go 언어에서는 가비지 컬렉터가 구현하는 알고리즘 동시 3차원 색상 표시 및 스캐닝 수집기입니다. 가비지 수집기는 Go 프로그램과 동시에 실행되므로 메모리의 잠재적인 변화를 감지하려면

쓰기 장벽

알고리즘이 필요합니다. 쓰기 장벽을 시작하는 유일한 조건은 짧은 시간 동안 프로그램을 중지하는 것입니다. 즉, "Stop the World"

Go 언어에는 가비지 수집 기능이 있나요?

쓰기 장벽의 목적은 수집기가 힙에서 데이터 무결성을 유지할 수 있도록 하는 것입니다. 수집 중

  • 2.1 구현 원칙

Go 언어 가비지 수집은 명확한 종료, 표시, 표시 종료 및 삭제의 네 가지 단계로 나눌 수 있으며, 그 중 두 단계에서는 STW(Stop The World)

가 생성됩니다. 🎜🎜🎜종료 단계 지우기🎜 🎜🎜🎜프로그램을 일시 중지하면 이때 모든 프로세서가 안전 지점에 진입합니다. 🎜🎜현재 가비지 수집 주기가 강제로 트리거되면 아직 실행되지 않은 메모리 관리 장치도 처리해야 합니다. 정리🎜🎜🎜🎜마크스테이지(STW)🎜🎜
  • 상태를 _GCmark로 전환하고, 쓰기 장벽, 사용자 프로그램 지원(Mutator Assists)을 활성화하고 루트 개체를 대기열에 넣습니다. _GCmark、开启写屏障、用户程序协助(Mutator Assists)并将根对象入队

  • 恢复执行程序,标记进程和用于协助的用户程序会开始并发标记内存中的对象,写屏障会将被覆盖的指针和新指针都标记成灰色,而所有新创建的对象都会被直接标记成黑色

  • 开始扫描根对象,包括所有 Goroutine 的栈、全局对象以及不在堆中的运行时数据结构,扫描 Goroutine 栈期间会暂停当前处理器

  • 依次处理灰色队列中的对象,将对象标记成黑色并将它们指向的对象标记成灰色

  • 使用分布式的终止算法检查剩余的工作,发现标记阶段完成后进入标记终止阶段

标记终止阶段 (STW)

  • 暂停程序、将状态切换至 _GCmarktermination 并关闭辅助标记的用户程序
  • 清理处理器上的线程缓存

清理阶段

  • 将状态切换至 _GCoff

  • 실행 프로그램을 재개하고, 지원을 위한 프로세스와 사용자 프로그램을 표시합니다. 메모리에 있는 개체를 동시에 표시하기 시작하고 쓰기 장벽은 덮어쓴 포인터와 새 포인터를 회색으로 표시하며 새로 생성된 모든 개체는 직접 검은색으로 표시됩니다

  • 모든 고루틴 스택을 포함하여 루트 개체 검색을 시작합니다. , 전역 객체, 힙에 없는 런타임 데이터 구조, 고루틴 스택 스캔 중에 현재 프로세서가 일시 중지됩니다.

회색 대기열에 있는 객체를 차례로 처리하고, 객체를 검은색으로 표시하고, 이들이 가리키는 객체를 표시합니다. in grey

분산 종료 알고리즘을 사용하여 남은 작업을 확인하고 마킹 단계가 완료된 후 마킹 종료 단계에 진입하는 것을 확인합니다

    마킹 종료 단계(STW)
  • 프로그램 일시 중지 상태를 _GCmarktermination으로 전환하고 보조 표시된 사용자 프로그램을 닫습니다
  • 프로세서의 스레드 캐시를 정리

    Cleaning 단계
  • 상태를 _GCoff로 전환합니다 코드> 청소 단계 시작, 청소 상태 초기화 및 쓰기 장벽 끄기<p></p>
  • 사용자 프로그램을 복원하면 새로 생성된 모든 개체가 흰색으로 표시됩니다

동시에 백그라운드에서 모든 메모리 관리 장치를 정리합니다. 고루틴이 새로운 메모리 관리 장치를 적용하면 정리가 시작됩니다

1Go 언어에는 가비지 수집 기능이 있나요?

2.2 3색 표시 방법🎜🎜🎜 3색 표시 알고리즘은 프로그램의 개체를 흰색, 검정색, 회색의 세 가지 범주로 나눕니다. : 🎜🎜🎜흰색 개체 - 가비지 수집기에 의해 메모리가 회수될 수 있는 잠재적인 쓰레기🎜🎜 검은색 개체 - 외부 포인터에 대한 참조가 없는 개체와 루트 개체에서 연결할 수 있는 개체를 포함한 활성 개체 🎜🎜 회색 개체 - 활성 개체, 흰색 개체를 가리키는 외부 포인터가 있기 때문에 가비지 수집기는 이러한 개체를 검색합니다. 하위 개체 🎜🎜🎜3색 표시 가비지 수집기의 작동 원리는 간단하며 다음 단계로 요약할 수 있습니다. 🎜🎜 🎜🎜회색 개체 모음에서 회색 개체를 선택하고 검은색으로 표시합니다. 🎜🎜🎜 🎜 검은색 개체가 가리키는 모든 개체를 회색으로 표시하여 개체나 해당 개체가 참조하는 개체가 재활용되지 않도록 합니다. 🎜🎜🎜 🎜 객체 그래프에 회색 객체가 없을 때까지 위의 두 단계를 반복하세요. 🎜🎜🎜🎜🎜 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 Go 언어에는 가비지 수집 기능이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿