[JAVA] Garbage Collection(가비지 컬렉션)이란?
[JAVA] Garbage Collection(가비지 컬렉션)이란?
JVM의 Runtime Data Area의 Heap부분의 가비지 컬렉션이 궁금해졌다
먼저 Heap(힙)부분을 정리해보자
- 인스턴스는 소멸 방법과 소멸 시점이 지역 변수와는 다르기에 힙이라는 별도의 영역에 할당된다.
- 자바 가상 머신은 매우 합리적으로 인스턴스를 소멸시킨다.
- 더 이상 인스턴스의 존재 유무가 없을 때 소멸시킨다.
New/ Young 영역
- Eden : 객체들이 최초로 생성되는 공간
- Survivor 0/1 : Eden에서 참조되는 객체들이 저장되는 공간
Old 영역
- New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간 Eden영역에 객체가 가득차게 되면 첫번째 GC(minor GC)가 발생함
- Eden영역에 있는 값들은 Survivor 1 영역에 복사되고 이 영역을 제외한 나머지 영역의 객체들은 삭제됨
Permanent Generation
- 생성된 객체들의 정보의 주소값이 저장된 공간
- Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역
- JVM에 의해서 실행됨
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Minor GC
- 새로 생성된 객체(instance)는 Eden 영역에 위치함
- Eden영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동
- 이 과정을 반복하다가 계속 살아남아 있는 객체는 일정 시간 참조되고 있다는 뜻으로 Old영역으로 이동함
Major GC
- Old영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제함
- 시간이 오래 걸리고 실행 중 프로세스가 정지된다
- 이것을 Stop the world라고 하는데
- Major GC가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다
- GC 작업이 완료한 이후에야 중단했던 작업을 다시 시작함
Garbage Collection은 어떤 원리로 소멸시킬 대상을 선정할까?
- 어떤 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability 없으면 unreachability로 판단함
- 하나의 객체는 다른 객체를 참조하고, 다른 객체는 또 다른 객체를 참조할 수 있기 때문에 참조 사슬이 형성이 되는데, 이 참조 사슬 중 최초에 참조한 것을 Root Set이라고 함
- 힙 영역에 있는 객체들은 총 4가지의 경우에 대한 참조를 하게 됨
- 힙 내의 다른 객체에 의한 참조
- Java스택, 즉 Java 메서드 실행 시에 사용하는 지역변수와 파라미터들에 의한 참조
- 네이티브 스택에 의해 생성된 객체에 대한 참조
- 메서드 영역의 정적 변수에 의한 참조
- 2,3,4는 Root Set이다. 즉, 참조 사슬 중 최초에 참조한 것
- GC의 대상이 되었다고 바로 소멸하는 것은 아니다.
- GC의 실행은 시스템에 부담이 될 수 있기에 GC는 별도의 알고리즘을 통해 타이밍을 스케쥴을 짠다
출처
댓글
댓글 쓰기