[Go] 가비지 콜렉션

natae·2022년 8월 13일
0

Golang

목록 보기
3/11

개요

  • golang은 가비지 콜렉션으로 인한 성능 저하를 최소화 하기 위해 압축과 세대별GC를 사용하지 않음
  • java, C# 등 가상머신 기반에서는 압축과 세대별GC를 사용함
    • 압축: 가비지 콜렉션 이후 메모리 단편화를 막기 위해 메모리 빈공간 없이 당겨오는 작업
    • 세대별GC: 힙영역을 세대별로 분리하여 가비지 컬렉션 범위를 효율적으로 사용(최근 세대가 오래된 세대보다 더 빈번하게 발생)
      • 오래된 세대가 최근 세대쪽 메모리를 참조할 경우, 최근 세대에서 가비지 콜렉션이 일어나면 null pointer가 발생
      • 이를 방지하기 위해 이러한 상황은 별도로 관리해야하는 write barrier 처리가 필요
  • golang은 압축을 하지 않는 대신 TCMalloc(Thread Caching Malloc)을 사용함
    • 할당시 바로 힙 영역을 사용하기전에 쓰레드 캐시를 먼저 사용하는 방식

코드

// go 1.18
// 가비지 콜렉션 확인
package study

import (
	"fmt"
	"math/rand"
	"runtime"
	"time"
)

func SliceGC() {
	checkGC(sliceGC)
}

func sliceGC() {
	intArr := make([]int, 900000)
	for i := 0; i < len(intArr); i++ {
		intArr[i] = rand.Int()
	}
}

func checkGC(funcToCheck func()) {
	var ms runtime.MemStats
	printMemStat(ms)

	funcToCheck()

	printMemStat(ms)
}

func printMemStat(ms runtime.MemStats) {
	runtime.ReadMemStats(&ms)
	fmt.Println("--------------------------------------")
	fmt.Println("Memory Statistics Reporting time: ", time.Now())
	fmt.Println("--------------------------------------")
	fmt.Println("Bytes of allocated heap objects: ", ms.Alloc)
	fmt.Println("Total bytes of Heap object: ", ms.TotalAlloc)
	fmt.Println("Bytes of memory obtained from OS: ", ms.Sys)
	fmt.Println("Count of heap objects: ", ms.Mallocs)
	fmt.Println("Count of heap objects freed: ", ms.Frees)
	fmt.Println("Count of live heap objects", ms.Mallocs-ms.Frees)
	fmt.Println("Number of completed GC cycles: ", ms.NumGC)
	fmt.Println("--------------------------------------")
}

출력

프로세스에 할당된 메모리에 근접하자, 가비지 콜렉션이 발생하여 "live heap objects"가 일정하게 유지됨

--------------------------------------
Memory Statistics Reporting time:  2022-08-14 01:07:35.127442 +0900 KST m=+0.000554668
--------------------------------------
Bytes of allocated heap objects:  121720
Total bytes of Heap object:  121720
Bytes of memory obtained from OS:  8522768
Count of heap objects:  152
Count of heap objects freed:  2
Count of live heap objects 150
Number of completed GC cycles:  0
--------------------------------------
--------------------------------------
Memory Statistics Reporting time:  2022-08-14 01:07:35.163681 +0900 KST m=+0.036791709
--------------------------------------
Bytes of allocated heap objects:  7317080
Total bytes of Heap object:  7331432
Bytes of memory obtained from OS:  17500944
Count of heap objects:  200
Count of heap objects freed:  51
Count of live heap objects 149
Number of completed GC cycles:  1
--------------------------------------

참고 문헌

profile
서버 프로그래머

0개의 댓글