개요

자바의 가비지 콜렉션 이하 GC(Garbage Collection) 에 대한 처리를 이해하기 위해서는 JVM 메모리 구조를 알아야 한다. 일반적으로 우리가 애플리케이션을 개발한다고 하면 생성되고 얼마있어 사라지는 객체들이 존재한다. JVM 메모리 구조 중 Heap 영역을 알아보자.


일반적으로 자바의 메모리 구조는 아래와 같은 영역으로 나뉘어져 있다.


Young Generation
Young Generation 의 영역에는 새롭게 생성된 모든 오브젝트가 위치한다. Young Generation 의 영역이 가득차게 되면 GC 는 작동하는데, 이러한 작동을 Minor GC 라고 부른다. 그리고 Young Generation 은 3개의 영역으로 구분된다.

  1. Eden Memory

  2. Survivor Memory 1

  3. 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 가 수차례 발생한다면 타임아웃 에러나 난다.


작성중 ... 


Posted by doubler
,