W2AS2L
2023. 3. 16. 18:24
2023. 3. 16. 18:24
Garbage Collection
- 사용하지 않는 객체는 메모리에서 삭제하는 작업을 GC라고 부르며 JVM에서 GC를 수행한다.
stop-the-world
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것.
- 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생하게 된다.
- GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면
- OutOfMemoryError가 발생하여 WAS가 다운될 수 도 있다.
- 따라서 규모있는 JAVA 어플리케이션을 효율적으로 개발하기 위해선 GC에 대해서 잘 알고 있어야 한다.
GC의 대상
- 객체가 NULL인 경우
- 블럭 실행 종료 후, 블럭 안에서 생성된 객체
- 부모 객체가 NULL인 경우, 포함하는 자식 객체
GC의 메모리 해제 과정(Mark and Sweap)
- Marking
- 프로세스는 마킹을 호출 → GC가 메모리가 사용되는지 아닌지를 찾아낸다.
- 모든 오브젝트는 마킹단계에서 결정을 위해 스캔되어 진다. 모든 오브젝트를 스캔하기 때문에 매우 많은 시간이 소모된다.
- Normal Deletion
- 참조되지 않는 객체를 제거하고, 메모리를 반환한다. 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해 두었다가 새로운 오브젝트가 선언되면 할당되도록 한다.
- Compacting
- 퍼포먼스를 향상시키기 위해, 참조되지 않는 객체를 제거하고 또한 남은 참조되어지는 객체들을 묶는다. 이들을 묶음으로서 공간이 생기므로 새로운 메모리 할당 시에 더 쉽고 빠르게 진행할 수 있다.
Generational Garbage Collection 배경
- 위의 과정과 같이 모든 객체를 Mark&Compact 하는 JVM은 비효율 적이다.
- Y축은 할당된 바이트 수, X축은 바이트가 할당될 때의 시간. 시간이 갈수록 적은 객체만이 남는 다는 것을 볼 수 있고, 위와같은 그래프에 기반한 것이 Weak Generational Hypothesis이다.
Weak Generational Hypothesis
- 신규로 생성한 객체의 대부분은 금방 사용하지 않는 상태가 되고, 오래된 객체에서 신규 객체로의 참조는 매우 적게 존재한다는 가설이다.
- 이 가설에 기반하여 자바는 Young 영역과 Old 영역으로 메모리를 분할하고, 신규로 생성되는 객체는 Young영역에 보관하고, 오랫동안 살아남은 객체는 Old 영역에 보관한다.
Generational Garbage Collection
- Young 영역
- 새롭게 생성한 객체의 대부분이 이곳에 위치한다.
- 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 Young영역에 생성되고 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
- Old 영역
- 접근 불가능 상태로 되지 않아 Young 영역에서 살아늠은 객체가 이곳으로 복사된다. 대부분의 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질때 Major GC가 발생한다고 말한다.
- Permanent 영역
- Method Area라고도 한다. JVM이 클래스들과 메서드들을 설명하기 위해 필요한 메타데이터들을 포함하고 있다. JDK8부터는 PermGen 은 Metaspace로 교체