개요
자바의 가비지 콜렉션 이하 GC(Garbage Collection) 에 대한 처리를 이해하기 위해서는 JVM 메모리 구조를 알아야 한다. 일반적으로 우리가 애플리케이션을 개발한다고 하면 생성되고 얼마있어 사라지는 객체들이 존재한다. JVM 메모리 구조 중 Heap 영역을 알아보자.
일반적으로 자바의 메모리 구조는 아래와 같은 영역으로 나뉘어져 있다.
Young Generation
Young Generation 의 영역에는 새롭게 생성된 모든 오브젝트가 위치한다. Young Generation 의 영역이 가득차게 되면 GC 는 작동하는데, 이러한 작동을 Minor GC 라고 부른다. 그리고 Young Generation 은 3개의 영역으로 구분된다.
Eden Memory
Survivor Memory 1
Survivor Memory 2
새롭게 생긴 많은 수들의 오브젝트들은 Eden Memory 에 위치한다.
Eden Memory 가 가득차게 되면 Minor GC 가 작동되고 여기서 살아남은 오브젝트(Survivor Object)들은 하나의 Survivor Memory 로 이동한다.
Minor GC 는 여기서 다시 한번 살아남은 오브젝트들은 또 다른 Survivor Memory로 이동시킨다. 따라서 두 개의 Survivor Memory 중에 하나는 항상 비어있는 상태를 유지하고 있다.
여러 번의 Minor GC 작동되고 여기까지 살아남은 객체는 Old Generation 으로 이동한다.
Minor GC 작동은 자주 일어나기 때문에 GC에 소요된 시간이 짧은 알고리즘이 적합하다.
Old Generation
Old Generation 의 영역에는 오래 살아있는 오브젝트들과 수차례 Minor GC 를 거쳐서 살아남은 오브젝트들을 포함하고 있다. 만약 Old Generation 이 가득차게 되면 GC 는 작동하며 이를 Major GC 라고 부른다. ( Full GC 라고 부르기도 한다. )
Major GC 는 매우 속도가 느리며, 일어나는 도중에 Java Application 순간적으로 멈춰버리기 때문에 Major GC가 일어나는 정도와 시간은 Application의 성능과 안전성에 큰 영향을 끼친다.
왜냐하면 Major GC 는 살아있는 전체 객체들을 검사하기 때문이다. 따라서 Major GC가 작동하는 것을 최소화해야 한다. 만약 Major GC 가 수차례 발생한다면 타임아웃 에러나 난다.
'jvm lang' 카테고리의 다른 글
20180408 [java servlet] 자바 서블릿은 어떻게 작동하는가 ? [ stackoverflow ] (0) | 2018.04.08 |
---|---|
20180403 Java Variable Types (수정 : 20190630) (0) | 2018.04.03 |
20180328 NewsCrawler Implements in Java (0) | 2018.03.28 |
20180222 Enum Type (Enumeration) 02 (0) | 2018.02.22 |
20180221 Enum Type (Enumeration) 01 (0) | 2018.02.21 |