Java Garbage Collection

Garbage Collection으로 인하여 프로그래머가 직접 Memory를 건들일은 없게 되었습니다. 그러나 명시적 Memory 해제보다 느리며 GC가 발생하는 순건 Suspend Time으로 인하여 다양한 문제가 발생하게 됩니다.

Root Set과 Garbage

Garbage 대상을 결정하는데에는 아래와 같은 구조를 기준으로 합니다.











  • Local variable, Operand Stact등에서 해당 객체를 참조하고 있으면, Reachable으로 판단.
  • 아직 메모리에 남아있으며, Native Method 영역으로 넘겨진 Object의 참조가 JNI 형태로 남아있으면 Reachable
  • 메서드 영역에 로딩된 클래스 중 Constant pool에 있는 Reference 정보를 토대로 쓰레드 에서 직접 참조하진 않지만 constance pool을 통해 간접 link를 하고있는 객체는 Reachable 이라고 한다.
Garbage Collection의 과정을 거치면 위의 Unreachable 객체를 제거하게 된다. 메모리 상에서 해당 객체를 지우면 당연히 단편화(Fragmentation)이 발생하게 되고 이를 위해 Compaction 알고리즘을 사용해야 한다.

Hotspot JVM의 Garbage Collection

GC 메커니즘은 두가지를 경험적 가설로 두고 있다.

  1. 대부분의 객체는 생성후 바로 Garbage가 된다.
  2. 오래된 객체가 새로운 객체를 참조할 일은 드물다.
첫번째 가설로 인하여 신생 객체들은 단편화를 자주 만들기에 eden 영역에 모아놓은 것이다.
두번째 가설의 경우 오래된 객체가 새로운 객체를 참조하는 경우가 발생할 경우 문제가 되는데, 그를 해결하기 위한 장치로 Card Table을 도입 하였다.

Card Table

Card Table












Old Object가 Young Object를 참조하게 되면 dirty로 표기하여 해당 내용을 Cart Table에 기록한다. Old 영역의 512 Byte당 1 Byte를 차지 하며, Minor GC 중Card Table만 빠르게 검색하여 가설 2의 단점을 해결 할 수 있게 되었다.

TLAB (Thread Local Allocation Buffers)

GC가 발생하거나 객체가 각 영역에서 다른 영역으로 이동할 떄 어플리케이션의 병목이 발생하면서 성능에 영향을 주게 됩니다. 그래서 Hotspot JVM에서는 스레드 로컬 할당 버퍼 (TLaBs) 라는 것을 이용합니다. 이를 통해서 각 쓰레드 별 메모리 버퍼를 사용하면 다른 스레드에 영향을 주지 않는 메모리 할당 작업이 가능하게 됩니다. 
TLAB를 통해서 메모리 할당

댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법