본문 바로가기

IT/Java언어

[JAVA] GC(가비지 컬렉터)의 동작원리

안녕하세요 남갯입니다


오늘은 네이버 D2에서 읽은 GC 의 내용을 옮겨서 정리해보려고합니다.


출처: https://d2.naver.com/helloworld/1329




가비지 컬렉터(GC)



GC의 동작원리

GC는 가비지 콜렉터로 힙영역에 동적할당된 메모리를 회수해가는 역할을한다.

Stop The World를 통해 GC를 실행시킨다. 

Stop The World란 GC를 실행시키기 위해 JVM이 어플리케이션 실행을 멈추는것 이다.

GC스레드를 제외한 나머지 스레드는 작업을 멈춘다. GC가 끝나야 중단한 작업을 시작한다.

GC의 튜닝은 Stop the world의 시간을 줄이는것




GC의 생성 가설

1. 대부분의 객체는 금방 접근불가능 상태가된다.

2. 오래된 객체의 젊은 객체로의 참조는 아주 적게 존재한다.

이 가설의 이름은 weak generational hypothesis


GC의 공간

Young영역: 새롭게 생성된 객체는 young에 생성, 대부분의 객체가 금방 접근 불가능이 되어서 생성되었다가 생성. Minor GC가 발생한다.


Old 영역

접근 불가능 상태가 되지 않아 살아남은것들은 Old영역으로 복사된다. 더 넓은 크기를 갖고있고 Young보다는 적게 GC발생 객체가 사라질때 Major GC가 발생한다.


Permanet{Perm영역(Method Area)}

객체의 intern(억류)가 된 문자열 정보를 저장하는곳 GC의 발생이 가능한데 Major GC의 횟수에 포함됨






Old영역이 Young영역을 참조할때

Old영역에는 512바이트 덩어리 카드테이블이 존재하며 Old영역에 있는 객체가 Young영역에 객체를 참조할때 정보가 표시된다. 따라서 Young영역의 GC를 한다면 Old영역을 확인하는게 아니라 Old의 카드테이블만을 확인해서 식별한다.





Young영역의 구성


Edn영역, Survivor 영역 2개,  총 3개의 영역이 존재

*** 새로운 객체가 생성시 Eden영역에 위치하고 GC후 살아남은건 Survivor의 하나로 이동 ->

Survivor가 다 쌓이면 다른 Survivor로 이동하고 하나는 빈상태로 변경 -> 이과정을 반복 후 살아있으면 Old 영역으로 이동



*** HotSpotVM 메모리저장을위한 기술 2가지

1. Bump the pointer

2. TLABs(Thread-Local Allocation Buffers)

Bump the Pointer : Eden영역에 마지막 객체 추적(맨위에있음) 다음에 남은크기와 들어오는 객체의 크기를 판단하여 메모리 할당이 이루어짐


TLABs: 멀티스레드 환경에서 여러스래드가 같은 객체를 참조하게 될경우 lock이 발생하는데, 각 스레드마다의 영역을 따로 설정해서 자신의 스레드의 객체 접근 가능하도록 변경

위에는 꼭 알필요는 없지만 기억하면 좋을수도 




Old영역에 대한 GC


Old영역은 기본적으로 데이터가 가득하면 GC를 실행 5가지 방식을 통해 진행한다.

  • serial GC
  • Parallel GC
  • Parallel Old GC
  • Concurrent Mark & Sweep GC
  • G1 GC


1. Serial GC: mark-sweep-compact 를 이용함.

old영역에 살아있는객체 식별 후 살아있는것만 남기고 앞부분부터 채워서 나눠서 정리한다.

** 메모리와 코어수가 적을때 적함


2. Parallel GC : Serical과 알고리즘은 같고 처리하는 스레드가 많음



3. Parallel Old GC Mark-Sweep-Compaction 알고리즘을 거친다. Summary에서 GC를 수행한영역에 대해서 별도로 살아있는 객체를 식별




4. CMS GC는 클래스로더에서 가장 가까운 객체중 살아있는것만 찾는다. 후에 참조가 끊기거나 추가된 객체 확인 마지막에는 쓰레기를 정리하는 작업

 StopTheWorld시간이 짧고 모든 어플리케이션 **응답속도가 매우 중요할 때사용

** CMS GC는 다른방식보다 메모리와 CPU를 많이 사용함.

** Compaction단계가 기본적으로 제공되지 않음



5. G1 GC

바둑판에 각 영역에 객체를 할당하고 GC를 실행 해당영역이 꽉차면 다른 영역에서 객체를 할당하고 GC를 실행 young에서 old영역으로 이동하는 단계가 사라진 GC방식