가비지 컬렉션 과정

Java에서는 개발자가 메모리를 명시적으로 해제하지 않는다. 대신에 Garbage Collector가 더 이상 필요 없는 객체를 찾아 지우는 작업을 한다. 이 가비지 컬렉터는 두 가지 가설 전제 하에 만들어졌다.

Weak Generational Hypothesis
        1. 대부분의 객체는 금방 접근 불가능 상태가 된다. 할당되고 짧은 시간 내에 사용이 종료되어 불필요한 상태인 것이 거의 대부분이다.
        2. 오래된 객체에서 젊은 객체로의 참조는 거의 발생하지 않는다.

이 가설의 장점을 최대한 살리기 위해서 메모리를 몇가지 영역으로 분리하여 관리하는 것이 효과적이다.

JVM Memory 영역
- Young 영역 : 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
Old 영역 : 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 
- Perm 영역 : Method 영역이라고도 부른다. Class, Method 등 메타 데이터가 저장된다. 

GC 종류
        - Minor GC : Young 영역에서 발생하는 GC
        - Major(Full) GC : Old 영역에서 발생하는 GC

GC 발생 과정
1. 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
2. Eden 영역이 가득 차 Minor GC가 발생하면 살아남은 객체가 Survivor 영역 중 하나로 이동해서 Age가 증가한다.
3. 다시 Eden 영역이 가득 차 Minor GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 이동해서 Age가 증가한다.
4. 그 Survivor 영역이 가득 차면 그 중에서 살아남은 객체가 다른 Survivor 영역으로 이동해서 Age가 증가한다.
5. 이 과정을 반복하다가 계속해서 살아남은 객체의 Age가 threshold 설정 값(default 16)이 되면 Old 영역으로 이동한다.
6. 이 과정을 반복하다가 Old 영역이 가득 차면 Major GC가 발생한다.

이 절차를 확인해 보면 두개의 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 Survivor 영역 모두 사용량이 0이라면 시스템이 정상적인 상황이 아니라고 생각하면 된다.


참조 링크 - Java Garbage Collection

'Development > Java' 카테고리의 다른 글

UnsupportedClassVersionError 에러 해결  (0) 2018.07.16
Garbage Collection 방식  (0) 2018.05.12
Garbage Collection 용어 정리  (0) 2018.04.26
AES256 암호화 오류 해결  (4) 2017.10.06
반복문 성능 비교  (0) 2017.07.27

+ Recent posts