콘텐츠로 건너뛰기

Java Hotspot Garbage Collection #2

 

Generational Collection

 

   이 기술은 각가의 메모리를 나이(generation)으로 나눈다. (보통 young과 old 2단계로 나눈다)

   여기서는 2가지 가정을 한다.

   – 대부분의 객체는 오랫동안 참조되지 않고 죽는다.

   – 더 오래되었거나 더 새 객체에 대한 참조는 거의 없다.

 

   YG(young generation)은 상대적으로 더 자주 실행되고 효율적이며 빠르다.

   YG중에서 살아남은 객체들은 진화하여 OG(old generation)이 된다.

   OG영역은 천천히 사용되며, GC가 적게 동작하고 한번 동작시 더 오래 걸리기도 한다.

 

   YG는 자주 실행되기 때문에 속도, OG는 메모리 용량 면에서 유리한 GC 알고리즘을 선택하게 된다

 

     

 

Java 5.0 HotSpot Garbage Collector

 

HotSpot Generations

 

   – young generation : 처음 생성된 객체들

   – old generation : 진화한 객체, 혹은 YG에 배정되기에는 큰 용량의 객체들

   – permanent generation : GC를 진행하는데 사용하는 자원들

 

   young generation

   – Eden + 2개의 survivor spaces 으로 구성

   – 처음 생성되는 객체는 모두 Eden에 할당된다.

   – 적어도 1번 이상 collection에서 살아 남으면 survivor space에 옮겨지게 된다.

   – OG에 들어가기에는 아직 충분하지 않은 경우 한 번 더 collection 되도록 기회를 준다)

 

     

 

   각 generation 영역이 가득차게 되면, 각 영역에 대한 collection이 수행된다.

   만약 YG에서 진화해서 OG로 올라와야 할 객체들이 OG의 수용량 보다 많은 경우,

   YGC은 수행되지 않는다. 대신, OGC이 전체 Heap 영역에 대해서 수행된다.

   (CMS collector는 예외)

 

Fast Allocation

 

   간단한 bump-the-pointer 기술을 이용해서 사용가능한 메모리의 인접 블럭에 할당한다.

   최근에 메모리 할당한 객체의 끝에 포인터로 표시해두고, 새로운 메모리 할당이 필요할 경우에 해당

   영역에 적절한지 검토한 뒤 할당하고 포인터를 업데이트 한다.

   멀티스레드 환경에서 동작할 때에는 병목현상이 생기고 퍼포먼스가 떨어진다.

   그래서 HotSpot JVM 에서는 Thread-Local Allocation Buffers(TLABs)라는 기술을 적용한다.

   이 기술은 각각의 스레드에 버퍼를 적용하여 퍼포먼스를 향상시킨다.

   TLABs의 소모 용량을 최소화하는 것이 필요한데, 평균적으로 Eden의 1%내외로 적용한다.

 

Serial Collector

 

   직렬방식은 YG, OG에 대한 GC를 모두 직렬로 처리한다.

 

   YG Collector

       

 

     

 

   OG collection

       

 

   직렬방식은 클라이언트에서만 실행되면서, pause time이 허용되는 프로그램에서 사용된다.

   J2SE5.0에서 직렬방식은 server-class 머신이 아닌 방식에서 디폴트로 선택된다.

   명시적으로 사용하려면 -XX:+UseSerialGC 를 추가하면 된다.

 

참고 문서 출처:

http://java.sun.com/javase/technologies/hotspot/gc/memorymanagement_whitepaper.pdf

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다