본문 바로가기
자바(Java)

G1 가비지 콜렉터 이전과 다른 점 & 동작 방식

by SSaMKJ 2016. 9. 30.
우선 이전 가비지 콜렉션에 대해서는 잘 정리가 되어 있는 네이버 D2(http://d2.naver.com/helloworld/1329) 문서를 참조 바랍니다.

읽고 오셨다는 가정하에 G1의 특징에 대해서만 정리하였습니다.


G1 garbage collector


G1은 Oracle JDK 7 update 4 와 그 이후 버전부터 완벽한 지원을 합니다.

G1의 목표 :

CMS처럼 동시에 진행.
GC 때문에 긴 stop-the-world 가 발생하지 않고 Compact한 여유 공간
예상 가능한 stop-the-world 주기
성능 저하를 줄일 것
자바 heap 보다 더 큰 메모리를 사용하지 않을 것


G1의 특징:

이전 가비지 콜렉터들(serial, paralle, CMS)은 모두 고정된 메모리의 young, old, permanent generation의 3 구역으로 나뉘는 구조였다. 



(이전 가비지 콜렉터 heap memory 구조)
(이미지 출처 : http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html)

그러나 G1은 다른 접근을 했다.




(G1 가비지 콜렉터 heap 메모리 구조)
(이미지 출처 : http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html)




동작 방식 :

heap 영역은 실제 메모리의 연속된 구간에 동일한 크기의 여러 세트로 나뉘어 있다. 세트들은 이전 가비지 콜렉터와 같은 역할(eden, survivor, old)들을 할당 받으나 그 크기는 정해지지 않는다. 각 영역에 대한 크기가 정해지지 않았으므로 메모리 영역의 사용에 대한 유연성을 제공합니다.

가비지 콜렉션이 수행되면 G1은 CMS 콜렉터와 비슷하게 작동합니다. G1은 heap 메모리에서 객채가 살아있는지 결정하는 동시적이고 전역적인 마킹을 수행한다. 
마킹 단계가 끝난 뒤에 어떤 지역이 가장 많이 비어 있는지 알 수 있게 되고 빈 공간이 많은 지역부터 메모리 회수를 시작합니다. 그래서 이름이 Garbage-First 입니다.


G1에 의해 교체를 해야하는 지역으로 확인된 곳은 배출(evacuation)에 의해 가비지 콜렉션을 당합니다. G1은 하나 이상의 지역으로부터 object를 카피하여 하나의 지역에 넣습니다. 그 과정에서 메모리를 비우고 최적화 한다. 
이 배출(evacuation)은 멀티 프로세스에 의해 병렬처리가 되기 때문에 stop-the-world 시간이 줄고, 처리 속도가 늘어난다.


정리 :
  • 이전과 동일하게 eden, survivor, old 영역은 있으나 permanent 영역은 사라졌다.
  • heap 영역을 작은 단위로 쪼개어 각 지역은 eden, survivor, old 영역으로 사용 가능하다. 이 것이 뜻하는 것은 각 영역의 크기가 가변적이라서 효율적인 활용을 뜻한다.
  • 병렬적으로 각 영역을 마킹하고 회수하기 때문에 stop-the-world 시간이 줄고 처리 속도가 늘어났다.

참고 : http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html




댓글