JAVA

JVM Generation 과 GC 과정

소농배 2020. 5. 6. 21:41

JVM Generation

 JVM 내의 모든 객체를 Mark 하고 Compact 하는 것은 매우 비효율적이기 때문에 Heap 영역은 아래 세가지 영역으로 나뉘어져 있다.

  • Young Generation
  • Old Generation (Tenured Generation)
  • Permanent Generation

Young Generation 은 새로운 객체가 할당되는 곳이다. Young Generation 이 꽉 차게 되면 Minor GC 가 발생한다. Minor GC 는 큰 객체의 해제율로 최적화 될 수 있다.Young Generation 이 사용되지 않는 객체로 모두 차게 되면 참조를 잃은 객체들은 매우 빨리 수집된다. Minor GC 로 부터 살아남은 객체들은 나이를 먹고(Aged) 결국에는 Old Generation 으로 옮겨진다.

 

모든 Minor GC 는 Stop the World Event 이다. 모든 쓰레드들은 Minor GC 가 끝날때까지 동작을 멈춘다. Minor GC 는 항상 Stop the World Event 이다.

 

Old Generation 은 오래동안 살아남은 객체들을 저장하는데 사용된다. 정형적으로, Young Generation 의 객체들에게 임계점이 설정된다. Age 가 이 임계점에 도달하게 되면 객체는 Old Generation 으로 옮겨지게 된다.  Old Generation 도 비워져야 할때가 있는데 이것을 Major GC 라고 한다. 

 

Major GC 또한 Stop the World Event 이다. 주로 Old Generation 에는 모두 살아있는 객체들이 저장되어 있기 때문에 Major GC 는 훨씬 느리다. 때문에 대응성에 대입하여 생각해보면 응용프로그램은 Major GC 를 최소화 해야한다. Major GC 는 어떤 Garbage Collector 를 사용하느냐에 따라서 Stop the World Event 의 시간이 정해진다.

 

Permanent Generation 은 응용프로그램에서 사용되는 클래스와 함수를 설명하기 위한 메타데이터를 보관하는 장소이다. Permanent Generation 은 응용프로그램이 사용할 클래스들을 기반으로 런타임에 JVM 에 의해서 할당된다. 더하여 Javs SE 라이브러리 클래스와 함수들도 이 곳에 저장된다.

 

JVM 이 Permanent Generation 에서 더 이상 사용되지 않는 공간에 다른 클래스를 로드해야 한다면 Full GC 에 의해서 수집될 수 있다.

 

Garbage Collection 과정

1. Eden 영역에 새로운 객체가 할당된다. 두 Survivor 영역은 빈 공간으로 시작한다.

2. Eden 영역이 가득차게 되면 Minor GC 가 실행된다.

3. 참조가 있는 객체는 첫번째 Survivor 영역으로 이동한다. 참조가 없는 객체는 Eden 영역이 비워질때 제거된다.

4. 다음 Minor GC 가 실행될때 Eden 영역에서는 위와 같은 과정이 반복된다. 그러나 한가지 다른점은 참조가 살아있는 객체들은 두번째 Survivor 영역으로 이동된다는 것이다. Eden 영역의 참조가 살아있는 객체가 두번째 Survivor 영역으로 이동될 뿐만 아니라 이전 Minor GC 에 의해서 첫번째 Survivor 영역으로 이동된 객체중 참조가 살아있는 객체는 Aging 되면서 두번째 Survivor 영역으로 이동된다. 이동된 후에 Eden 영역과 Survivor 영역은 모두 Clear 된다. 중요한점은 두번째 Survivor 영역에는 Aging 이 다른 객체들이 각기 존재한다는 것이다.

5. 다음 Minor GC 에서 같은 과정이 반복된다. 참조가 살아있는 객체가 저장되는 Survivor 영역은 또 다시 두번째 Survivor 에서 첫번째 Survivor 로 바뀐다. 살아있는 객체들은 Aging 된다.

6. Minor GC 후에 특정 Age 임계치에 도달한 객체들은 Old Generation 으로 Promotion 된다. (예제의 임계치는 8)

7. 때문에 Minor GC 가 계속되면 Old Generation 에 객체들이 계속 Promotion 된다. Old Generation 이 가득차게 되면 객체를 삭제하고 압축하기 위항 Majro GC 가 수행된다.

 

 

출처 : https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html