가비지 컬렉션, 컬렉터(Garbage Collection)

woonie·2022년 6월 25일
0

1. 가비지 컬렉션

Garbage Collection 약어로 GC라고 부른다.
메모리 관리 방법중 하나로 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.
가비지 컬렉션이 없다면 프로그래머가 메모리를 할당한 뒤 수동으로 해제까지 직접 해야 한다.
메모리를 할당해놓고 필요 없어진 뒤에도 해제를 안하여 메모리 누수가 생기거나 해제했던 메모리를 다시 사용하는 실수 등에서 버그가 양산된다.
이러한 문제들을 해결하기 위해서 제시된게 가비지 컬렉션이다. 가비지 컬렉션에서 제공하는 할당과 해제를 이용하여 자동으로 프로그램이 실행되며 생기는 쓸모없어지는 메모리들을 알아서 수집하고 관리해준다.

2. 가비지 컬렉터의 원리

GC작업을 하는 가비지 컬렉터는 아래와 같은 일을 한다.

  • 메모리 할당
  • 사용중인 메모리 인식
  • 사용하지 않는 메모리 인식

즉 메모리가 부족한 경우 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다.
프로그램을 실행할때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.

이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 가비지가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게 선언되거나 형변환이 되면서 다른곳을 가리키게 되면서 주소를 잃어버리고 다시 찾을 수 없게 되면서 정리되지 않은 메모리가 생겨버리게 되기 때문이다.

그래서 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있도록 메모리 해제를 시키며 이것이 가비지 컬렉터의 목적이다.

자바에서는 JVM이 메로리를 부여받고 프로그램을 실행하면서 메모리가 부족해지는 순간이 오면 추가적으로 메모리를 더 요청한다. 요청하는 바로 이때 가비지 컬렉터가 실행된다.

3. JVM의 Heap영역

JVM의 메모리는 크게 클래스 영역, 자바 스택, 힙, 네이티브 메소드 스택으로 4개의 영역으로 나뉜다.
가비지 컬렉터에서는 여기서 힙 메모리를 다루게 된다.
Heap은 Young, Old, Perm으로 다시 3개의 영역으로 나뉘게 되는데 Young영역에서 발생한 GC를 Minor GC, Old 와 Perm영역에서 발생한 GC를 Major GC(또는 Full GC)라고 한다.

  • Young : 새롭게 생성한 객체가 위치, 대부분의 객체가 금방 닿을 수 없는 상태가 되기 때문에 많은 객체가 이 영역에서 생성되었다가 사라진다.
  • Old : Young영역에서 참조할 수 있는 상태를 유지해 살아남은 객체가 여기로 복사된다. 대부분 Young영역보다 크게 할당되며 크기가 큰 만큼 Young영역보다는 GC가 적게 발생한다.
  • Perm : 클래스와 메소드 정보와 같이 자바 언어 레벨에서는 거의 사용되지 않는 영역이다.

4.가비지 컬렉션 동작 과정

4-1. 첫 번째 과정

객체가 처음 생성되고 Heap영역의 Eden에 age-bit 0으로 할당된다. 이 age-bit는 Minor GC에서 살아남을 때마다 1씩 증가한다.

4-2. 두 번째 과정

시간이 지나 Heap Area의 Eden영역에 객체가 다 쌓이면 Minor GC가 한번 일어나게 되고 참조 정도에 따라 Servivor0영역으로 이동하거나 회수된다.

4-3. 세 번째 과정

계속해서 Eden영역에는 신규 객체들이 생성된다. 이렇게 또 Eden영역에 객체가 다 쌓이게 되면 Young영역에 있는 객체들을 비어있는 Survival1영역에 이동하고 살아남은 모든 객체들은 age가 1씩 증가한다.

4-4. 네 번째 과정

다시 Eden영역에 신규 객체들로 가득 차게되면 다시한번 Minor GC가 일어나고 Young영역에 있는 객체들을 비어있는 Survival0으로 이동시킨 뒤 age를 1증가하며 이 과정을 계속 반복한다.

4-5. 다섯 번째 과정

이 과정을 반복하다 보면 age-bit가 특정 숫자 이상으로 되는 경우가 발생한다. 이때 JVM에서 설정해놓은 age-bit에 도달하게 되면 계속 쓰일 객체라고 판단하고 Old영역으로 이동시킨다.
해당 과정을 프로모션(Promotion)이라고 한다.

4-6. 여섯 번째 과정

시간이 지나 Old영역에 할당된 메모리가 허용치를 넘게되면 Old영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 모두 삭제하는 GC가 실행된다. 이렇게 Old영역의 메모리를 회수하는 GC를 Major GC라고 한다. Major GC는 시간이 오래 걸리는 작업이고 이때 GC를 싱행하는 스레드를 제외한 모든 스레드는 작업을 멈추게 된다. 이를 Stop-the-World라고 한다.
하지만 이 작업이 너무 잦으면 프로그램 성능에 문제가 될 수 있다.



* 참고

https://coding-factory.tistory.com/828
https://mangkyu.tistory.com/118
https://hbase.tistory.com/209
https://beststar-1.tistory.com/15
https://luv-n-interest.tistory.com/922
https://velog.io/@bumsu0211/JavaScript-Garbage-Collection

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글