Heap

참조형의 데이터 타입을 갖는 객체와 배열, Collation 등이 저장되는 곳

JAVA에서는 크게 Stack영역과 Heap 영역으로 구분할 수 있다.
Stack은 기본적으로 메소드 내에서 정의하는 기본 자료형(int, double, long..)에 해당하는 지역 변수가 포함되고, Heap의 경우 참조 자료형(Integer, 배열, Collation)이 저장이 된다.

Stack의 경우 해당 메소드가 종료되면 변수들이 메모리에서 해제되지만, Heap은 메소드 호출이 끝날 때가 아닌, 해당 변수에 대한 참조가 사라져서 GC에 의해 지워지거나 JVM이 종료될 때 메모리에서 해제된다.



Heap Structure

Heap 영역은 크게 Young Generation, Old Generation 2개 영역으로 구성되어 있다.
그 중 Young Generation은 Eden, S0, S1 영역으로 나뉘어진다.
이렇게 Heap의 영역을 나누는 사유는 JVM 내부적으로 메모리를 효과적으로 관리하기 위해서다.



Garbage Collection 동작 과정

Heap Structure을 이용한 GC의 동작 과정을 설명하겠다.

  1. 최초 생성된 객체는 Young generation의 'Eden'영역으로 들어간다.


2. 객체가 계속 생성되어 Eden영역이 꽉 차게 된다.

3. GC가 발생하여 현재 참조하고 있지 않는 객체는 할당은 해제하고, 오래된 객체는 S0 영역으로 이동시킨다. 이 때 Young geneartion에서 발생하는 GC를 Miner GC라고 한다.

4. 다시 Eden 영역의 메모리가 꽉 찼다. 다시 Miner GC가 발생한다. Eden 영역에서 오래된 객체는 S0로 이동하고, S0의 존재하던 더 오래된 1개의 객체 중 1개 객체는 참조되지 않고 있어 해제되고 나머지 1개만 S1으로 이동한다.

5. 계속 Miner GC가 발생하다가 오랫동안 참조되는 객체는 Old Generation의 'Tenured'영역으로 이동한다.

6. Tenured 영역이 꽉 차는 경우 Old Generation에서 GC가 발생하며, 이를 Major GC라고 부른다.

7. GC는 Young Generation, Old Generation에서 지속적으로 발생하며, Miner GC, Major GC가 모두 실행되는 것을 Full GC라고 부른다.

기본적으로 GC는 Heap영역이 Full 상태에서 발생하며, GC가 발생할 때마다 생성된 시간에 따라서 현재 참조되고 있는 객체를 각 영역으로 이동시킨다.

0개의 댓글