코드코코

[Garbage collector] 가비지컬렉터 , 메모리 정리 본문

기록/정리

[Garbage collector] 가비지컬렉터 , 메모리 정리

코드코코 2021. 11. 29. 19:29
package main

import "fmt"

func add() *int {
	//garbage collector : 불필요한 메모리를 정리해 줌.
	//메모리가 정리되는 기준점 : 메모리(변수)가 필요 없어지는 순간
	//즉, 'reference count = 0' 이 되는 순간 GC가 지움.

	//reference count
	var a int //1
	var p *int

	a = 3
	p = &a //2

	fmt.Println(*p)

	//1.리턴되는 순간 메모리가 사라지는 것이아니라,
	return p
}

func main() {

	//2. 실행이 끝나는 순간 메모리가 정리됨.
	v := add()

	fmt.Println(v)
}

Garbage Collector : 불필요한 메모리를 자동으로 정리해 줌.

 

GC의 유무에 따라 

managed language : JAVA, GO

unmanaged language : C , C++


C언어에서 GC
 
스택 메모리
 - 변수는 스택메모리
 - 변수의 생명주기에 맞는 스코프 범위를 벗어나면 메모리는 무조건 사라져야 함.
 
힙 메모리
 - 프로그래머가 힙 메모리 할당 가능
 - 할당방법은 malloc(사이즈)이용
 - 그리고 사용하고 나서는 free로 수동으로 메모리 삭제하여 정리하여야 함.

메모리 관련 버그들
 - memory leak: 흔히들 하는 실수.
 - dangiling : 사라진 메모리를 참조하는 경우.
 
GC 특징
 -  전수조사
 -  하는 일이 많다.
 -  메모리를 많이 사용한다.
 -  속도가 느림
 -  과거는 GC작동시 2~3초 가량 멈추는 경우도 있었지만, 멀티쓰레드의 발전으로 보완됨.
 -  GC가 무조건 memory leak를 막아주는 것은 아니다.
 
 
GO에서 GC
 
 - 기준 : reference count가 0 인 메모리들을 정리
 - 외딴섬 : reference count가 0 이 아님에도 외부에서 아무도 참조하지 않는 경우,
    > a->b->c->a 서로를 카운터하지만, 외부에서는 아무도 a,b,c를 가르키는 것이 없다.
    > memory leak에 해당하며, GC의 관리대상