GC란,
Java 를 경험한 사람들은 가비지컬렉션, 가비지컬렉션 하는 말들을 못들어봤을리가 없습니다.
그러나, Java 로 개발하는 사람들에게 가비지컬렉션이 뭔가요? 라는 질문을 하면 흠칫 하는 경우가 많습니다.
알고 있는데, 설명을 하지 못하는 것은 모른다고 보는게 맞습니다.
오늘은 이렇게 모르면 안되는, 하지만 모르는 경우가 많은
가비지 컬렉션(GC) 에 대하서 알아보려고 합니다.
GC (Garbage Collection) 란,
프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제 하는 메모리 관리 기법입니다.
" 더이상 사용되지 않는 메모리를 제거합니다. "
" 참조되지 않는 메모리를 해제합니다."
" 자동으로 메모리를 관리해줍니다. "
와 같은 답변은 맞는듯 아닌듯 저 말만 듣고는 이해하기 쉽지 않습니다.
앞으로 GC 가 무엇인가요? 에 대한 답은
프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제 하는 메모리 관리 기법입니다.
로 했으면 합니다.
우리가 모르고 넘어가던 핵심포인트는 GC 는 메모리 관리 기법 중 하나 라는 것입니다.
GC 는 어쩌다 탄생했나?
기본적으로 C 와 C++ 등의 언어에서 사용되지 않는 메모리 영역을 해제하기 위해 수동으로 메모리를 관리하였습니다.
Lisp 라는 언어에서 이같은 수동 메모리 관리를 단순화하기 위하여 GC 가 발명되었습니다.
역사공부는 적당히 하고.... 결국
"수동 메모리 관리" -> "자동 메모리 관리" 를 하기 위해 탄생했다고 보면 됩니다.
GC 장단점
GC 를 기본적으로 제공하는 언어나, GC를 구현한 프로그램 에서는 다음과 같은 장단점이 존재합니다.
<장점>
아래와 같은 버그를 줄이거나, 방지할 수 있습니다.
1. 유효하지 않은 포인터 접근
- 이미 해제된 메모리에 접근하는 경우에 발생하는 버그입니다.
만약 메모리에 다른 값이 새로 할당되었다면, 해당 메모리를 바라보던 포인트는 전혀 다른 값을 반환하게 됩니다.
2. 이중 해제
- 이미 해제된 메모리를 다시 해제하는 경우에 발생하는 버그입니다.
ex) free() 같이 수동으로 메모리를 해제 하는 과정에서 이미 해제된 메모리를 한번더 해제 하면서 에러를 발생시킵니다.
3. 메모리 누수(메모리 릭)
- 프로그램이 더이상 필요로 하지 않는 메모리 영역이 해제되지 않고 남아있는 경우를 말합니다.
메모리 누수가 반복되는 경우 사용가능한 메모리 영역이 고갈나게되고, 그 경우 프로그램은 중단됩니다.
* 메모리 누수가 아님에도 메모리 영역이 고갈나는 경우는 GC 로도 막을 수 없습니다.
<단점>
1. 해제해야 하는 메모리를 결정하는 오버헤드
- GC 는 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제 하는 메모리 관리 기법입니다.
라고 하였습니다. 그렇다면 필요없게 된 영역을 누가 알려주죠? 개발자가 직접 알려주나요? 나 여기 필요없어.
그럴거면 수동으로 메모리를 관리하는 것과 무슨 차이가....
따라서, GC가 동작할 때, 필요없게 된 영역을 결정해야 하는 로직이 동작합니다.
이때 결정하기 위한 오버헤드가 발생합니다.
2. 할당된 메모리가 해제되는 시점을 알 수 없다.
- 일반적으로 GC 는 개발자가 호출하지 않습니다.(자바의 경우 JVM 의 가비지컬렉터 가 이를 실행합니다.) 즉, 개발자가 "변수=null" 을 통해서 더이상 사용하지 않기 위해 참조를 해제한다고 하더라도, GC가 동작하기 전까지는 메모리 영역에서 해제되지 않는다는 겁니다.
안드로이드를 기점으로 생각해볼까요? Activity 가 실행되고 있을 때, 해당 Activity 가 종료되면 Activity 가 사용하던 메모리 영역은 그 즉시 해제되나요? 확신할 수 있나요?
GC원리를 학습하면, 해제해야하는 대상을 결정하는 로직을 보게 됩니다. 그런 로직에 따라서 결정되는데 프로그램을 개발하는 순간에 GC 가 해제해야 하는 대상을 결정하는 로직과, GC가 일어나는 타이밍들을 100% 고려하여 작성할 수 있나요?
저희는 GC가 언제 동작하는지 예측하는것도 어려울 뿐더러, 그 GC 가 동작하는 순간에 어떤 메모리 영역을 해제해야 대상으로 선택했는지 에 대해서 알 수 없다고 봐야합니다.
< Java GC 에 대해서 좀 더 알아보고 싶다면 >
devhyeon0312.tistory.com/17 게시글을 확인해주세요 🤗
'BackUp (관리중지) > CS 학습' 카테고리의 다른 글
REST API (0) | 2021.04.28 |
---|---|
Java GC (0) | 2021.04.28 |
동시성 이슈 (0) | 2021.04.27 |
쓰레드(Thread) / 프로세스(Process) (0) | 2021.04.27 |
동기(Synchronous) / 비동기(Asynchronous) (2) | 2021.04.27 |