Go 언어에는 가비지 컬렉션이 있습니다. Go 언어에는 GC(가비지 수집 메커니즘)가 포함되어 있으며 더 이상 사용되지 않는 변수를 검색하여 해제하는 별도의 프로세스를 통해 실행됩니다. 계산 중. 메모리 공간에는 두 가지 중요한 영역이 포함됩니다. 스택 영역(Stack)과 힙 영역(Heap)은 일반적으로 함수 호출의 매개변수, 반환 값 및 로컬 변수를 저장하고 메모리 조각화를 생성하지 않으며 관리됩니다. 컴파일러이며 개발이 필요하지 않습니다. 힙 영역은 메모리 조각을 생성합니다. Go 언어에서 힙 영역의 개체는 메모리 할당자에 의해 할당되고 가비지 수집기에 의해 재활용됩니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
Go 언어에는 자체 GC(가비지 수집 메커니즘)가 있습니다. GC는 더 이상 사용되지 않는 변수를 검색하여 해제하는 별도의 프로세스로 수행됩니다. GC가 실행될 때 머신 리소스를 차지한다는 점에 유의해야 합니다.
컴퓨터 과학에서 가비지 수집(GC)은 자동 메모리 관리 메커니즘으로, 더 이상 사용되지 않는 프로그램을 재활용하려고 합니다. 객체 및 점유 메모리
컴퓨팅에서 메모리 공간에는 두 가지 중요한 영역이 있습니다: 스택 영역(Stack) 힙 영역(Heap)은 일반적으로 함수 호출의 매개변수, 반환 값 및 로컬 변수를 저장하고 메모리 조각화를 생성하지 않으며 컴파일러에 의해 관리되며 힙 영역은 개발자 관리가 필요하지 않습니다. Go 언어에서 힙 영역의 개체는 메모리 할당자에 의해 할당되고 가비지 수집기에 의해 재활용됩니다. [관련 권장 사항: 일반적으로 가비지 컬렉터의 실행 프로세스는 두 개의 반독립적인 구성 요소로 나뉩니다.프로그래머는 GC에 대해 걱정할 필요가 없으며 더 이상 프로그램이 거의 보이지 않을 때 남은 메모리를 자동으로 해제할 필요가 없습니다. 프로그래머에게는 프로그램에 특별한 최적화가 필요한 경우에만 제어 가능한 API를 제공하여 GC의 실행 타이밍과 실행 오버헤드를 제어할 수 있습니다.
Linear Allocator
Linear Allocator(Bump Allocator)는 효율적인 메모리 할당 방법이지만 몇 가지 단점과 큰 한계가 있습니다. 사용자가 선형 할당자를 사용하는 경우 메모리의 특정 메모리 위치에 대한 포인터만 유지하면 됩니다. 사용자 프로그램이 할당자에서 메모리를 적용하는 경우 할당자는 남은 여유 메모리만 확인하고 할당된 메모리를 반환하면 됩니다. 선형 할당자는 실행 속도가 더 빠르고 구현 복잡성이 낮지만 메모리가 해제된 후에는 메모리를 재사용할 수 없습니다. 아래와 같이 할당된 메모리를 재활용하면 선형 할당자는 레드 메모리를 재사용할 수 없습니다 따라서 선형 할당자는 적합한 가비지 수집 알고리즘과 함께 사용해야 합니다
Free-List Allocator
Free-List Allocator(Free-List Allocator)는 해제된 메모리를 재사용할 수 있으며 내부적으로 연결 목록과 유사한 데이터 구조를 유지합니다. 사용자 프로그램이 메모리를 적용하면 무료 연결 목록 할당자는 충분한 크기의 메모리를 찾기 위해 사용 가능한 메모리 블록을 순회한 다음 새 리소스를 적용하고 연결 목록을 수정합니다무료 연결 목록 할당자에는 네 가지 일반적인 전략이 있습니다.
Go 언어에서는 힙에 있는 모든 객체가
runtime.newobject 함수를 호출하여 메모리를 할당합니다. 이 함수는
runtime.mallocgc를 호출하여 지정된 크기의 메모리 공간을 할당합니다. 이는 사용자에게 필요한 기능이기도 합니다. 힙에 메모리 공간을 적용하는 프로그램 func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
mp := acquirem()
mp.mallocing = 1
c := gomcache()
var x unsafe.Pointer
noscan := typ == nil || typ.ptrdata == 0
if size
runtime.mallocgc
가 객체의 크기에 따라 서로 다른 할당 로직을 수행하고, 이를 작은 객체로 나누는 코드를 보면 알 수 있습니다. 개체 크기에 따른 개체 및 대형 개체
(0, 16B)
— 먼저 마이크로 할당자를 사용한 다음 스레드 캐시, 중앙 캐시 및 메모리 할당을 위한 힙 runtime.mallocgc
根据对象的大小执行不同的分配逻辑,根据对象大小将它们分成微对象、小对象和大对象
(0, 16B)
— 先使用微型分配器,再依次尝试线程缓存、中心缓存和堆分配内存[16B, 32KB]
— 依次尝试使用线程缓存、中心缓存和堆分配内存(32KB, +∞)
— 直接在堆上分配内存小分配
对于小于 32kb 的小分配,Go 会尝试从 mcache
的本地缓存中获取内存,该缓存处理一个跨度列表 (32kb 的内存块) mspan
每个线程 M 都分配给一个处理器 P,一次最多处理一个 goroutine
。在分配内存时,当前的 goroutine
将使用其当前的本地缓存 P 来查找 span
소형 개체 [16B, 32KB]
— 스레드 캐시를 차례로 사용하고 중앙 캐시와 힙에 할당된 메모리
대형 개체 (32KB, +) — 힙에 직접 메모리 할당<strong></strong>
소규모 할당
32kb 미만의 소규모 할당의 경우 Go는 범위 목록을 처리하는 mcache
에서 시작하려고 시도합니다. (32kb 메모리 블록) mspan
각 스레드 M은 프로세서 P에 할당되며, 한 번에 최대 하나씩goroutine
처리할 수 있습니다. 메모리를 할당할 때 현재 goroutine
은 현재 로컬 캐시 P를 사용하여 span
목록에서 사용 가능한 첫 번째 자유 개체를 찾습니다.
Go는 그렇지 않습니다. 대규모 할당을 관리하려면 로컬 캐시를 사용하세요. 32kb보다 큰 할당은 페이지 크기로 반올림되어 페이지가 힙에 직접 할당됩니다.
2. 가비지 컬렉션
알고리즘이 필요합니다. 쓰기 장벽을 시작하는 유일한 조건은 짧은 시간 동안 프로그램을 중지하는 것입니다. 즉, "Stop the World"
쓰기 장벽의 목적은 수집기가 힙에서 데이터 무결성을 유지할 수 있도록 하는 것입니다. 수집 중
Go 언어 가비지 수집은 명확한 종료, 표시, 표시 종료 및 삭제의 네 가지 단계로 나눌 수 있으며, 그 중 두 단계에서는 STW(Stop The World)
가 생성됩니다. 🎜🎜🎜종료 단계 지우기🎜 🎜🎜🎜프로그램을 일시 중지하면 이때 모든 프로세서가 안전 지점에 진입합니다. 🎜🎜현재 가비지 수집 주기가 강제로 트리거되면 아직 실행되지 않은 메모리 관리 장치도 처리해야 합니다. 정리🎜🎜🎜🎜마크스테이지(STW)🎜🎜상태를 _GCmark
로 전환하고, 쓰기 장벽, 사용자 프로그램 지원(Mutator Assists)을 활성화하고 루트 개체를 대기열에 넣습니다. _GCmark
、开启写屏障、用户程序协助(Mutator Assists)并将根对象入队
恢复执行程序,标记进程和用于协助的用户程序会开始并发标记内存中的对象,写屏障会将被覆盖的指针和新指针都标记成灰色,而所有新创建的对象都会被直接标记成黑色
开始扫描根对象,包括所有 Goroutine 的栈、全局对象以及不在堆中的运行时数据结构,扫描 Goroutine 栈期间会暂停当前处理器
依次处理灰色队列中的对象,将对象标记成黑色并将它们指向的对象标记成灰色
使用分布式的终止算法检查剩余的工作,发现标记阶段完成后进入标记终止阶段
标记终止阶段 (STW)
_GCmarktermination
并关闭辅助标记的用户程序清理阶段
将状态切换至 _GCoff
_GCmarktermination
으로 전환하고 보조 표시된 사용자 프로그램을 닫습니다 _GCoff로 전환합니다 코드> 청소 단계 시작, 청소 상태 초기화 및 쓰기 장벽 끄기<p></p>
위 내용은 Go 언어에는 가비지 수집 기능이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!