GC의 동작 원리에 대해 정리해 본 글입니다.
Garbage Collector
힙 메모리 영역 중 더 이상사용하지 않는 자원을 찾아내어 해제하는 기능
- 프로그램의 실행 중간에 쓸모 없는 메모리를 알아서 수집/삭제
- 메인 쓰레드와 별개로 백그라운드로 데몬 쓰레드에서 GC를 수행
힙 메모리와 GC
힙 메모리는 JVM 메모리 영역 중의 하나로 new 키워드를 통해 동적으로 할당된 객체들을 저장하는 공간이다.
힙 메모리에 저장된 객체에 대해 GC가 돌면서 더이상 참도되지 않는 객체를 판별하고 제거한다.
힙 메모리는 모든 쓰레드가 공유하는 공간이고 JVM이 실행될 때 생성된다.
힙 영역은 대부분의 객체는 일회용이며 오래동안 메모리에 남아 있는 경우는 드물다는 조건하에 설계되었다. 따라서, 내부적으로 객체의 생존기간에 따라 YOUNG, OLD 총 2가지 영역으로 설계되었다. 참고로 Old 영역이 Young 영역보다 크다.
Young 영역은 새롭게 생성된 객체가 할당되는 영역이고 이 영역에서 활동하는 GC를 Minor GC라고 부른다. 이 영역 중에서도 eden영역에는 막 생성된 객체가 할당되고 Eden 영역이 가득 차서 Minor GC가 수행되어 참조되지 않는 객체들을 해제하고 남은 객체들을 Survivor Space 중 1개로 이동시킨다. Survivor Space도 가득 차게 되면 다른 Survivor Space로 이동시킨다. 이 때, 둘 중의 하나의 Survivor Space는 항상 비워져 있어야한다.
참고로, Minor GC가 발생할 때마다 객체들은 age값을 증가시키게 되고 age값이 커짐에 따라 Old 영역으로 이동한다.
Old 영역은 오래 살아남은 객체들이 복사되는 곳으로 이 영역에서 활동하는 GC를 Major GC라고 부른다. Old 영역의 메모리가 부족해지면 Major GC가 발생하게되는데 Old 영역이 Young 영역보다 크기 때문에 GC가 수행하는 시간이 10배 이상 더 오래 걸린다.
Major GC vs Minor GC
Major GC와 Minor GC가 각각 동작하는 Old, Young 영역은 서로 다른 메모리 구조로 되어있기 때문에 세부적인 동작 방식이 다르다. 하지만 둘의 공통된 동작 방식은 Stop The World, Mark And Sweep으로 같다.
- Stop The World(STW)
- GC를 수행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
- GC를 수행하는 쓰레드를 제외한 모든 쓰레드에 대해 동작을 멈추고 작업 수행
- Mark And Sweep
- 사용하는 메모리와 사용되지 않는 메모리를 구분하는 작업**(Mark)**
- Mark 단계에서 사용되지 않음으로 구분된 메모리를 해제하는 작업**(Sweep)**
여기서 중요한 점은 Old 영역은 Young 영역보다 크기가 크고, 이 때문에 GC가 수행되는 시간이 10배 이상 크다고 했는데 Stop The World 단계에서 GC를 제외한 모든 쓰레드들의 동작을 중지시킨다는 점이다. 실제 가동되고 있는 서비스라면 중단되면 안되기 때문에 Old 영역의 메모리가 가득차지 않도록 주의해야 할 것이다. 반대로 Minor GC는 Young 영역의 크기가 작기 때문에 애플리케이션에 크게 영향을 주지 않는다고 한다.
출처
[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)
1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는..
mangkyu.tistory.com
[JAVA] Garbage Collection의 개념과 동작 원리
Garbage Collection은 자동으로 사용되지 않는 메모리를 정리해주는 기능입니다. 자바에는 Garbage Collection이라고 하는 메모리 관리 기능이 존재합니다. Garbage Collection 이란? 쓰레기를 수집한다는 이름
hajoung56.tistory.com
GC 동작원리
GC 구조와 동작원리
wooody92.github.io
'개인 공부' 카테고리의 다른 글
정적 팩토리 메서드 (0) | 2022.11.21 |
---|---|
Logback.xml 동일 패키지 내 다른 레벨 처리 (2) | 2022.11.10 |
프로토 타입 패턴 (0) | 2022.10.30 |
도커(Docker)와 가상머신(VM) (0) | 2022.10.28 |
String, StringBuilder, StringBuffer 사용 경우 (0) | 2022.10.28 |