본문 바로가기

Programming/Java

Java8 G1 garbage collection 특징

Java 8 부터는 G1 GC 를 기본으로 설정 되어있다.


자세히 알아보기 전에 미리 알아두어야 할 것들이 있다.


Java 7

  • update 4 부터 parallel GC 가 기본으로 설정되어있다.
  • JVM 옵션 (아래 둘 중에 아무거나 하나)
    • -XX:+UseParallelGC
    • -XX:+UseParallelOldGC


parallel GC 의 특징
  • application 의 throughput 이 latency 보다 중요할 때 (i.e. batch 프로그램)


CMS GC 의 특징

  • application thread 와 garbage collection thread 가 동시에 실행된다.
  • application latency 를 향상 시키는 것에 주안점을 두었다. (GC 의 횟수를 줄이는 것)
  • parallel GC 보다 약 10~20% heap memory 를 더 사용한다.
  • old 영역에 대한 compaction 을 수행하지 않아서 memory fragmentation 이 발생한다.
  • memory 파편화 때문에 GC 시간이 길어질 수 있다. 
  • Full GC 를 예측할 수 없다는 단점이 존재
  • Old 영역의 사용량이 특정 threshold 값이 넘었을때 수행된다.



Java 8


G1 GC 특징

  • GC 의 대상 영역이 여러개의 region 으로 나뉘어 있기 때문에 GC 가 일어나면 전체 heap 에 대해서 GC 를 하지 않고, 일부 region 에서만 GC 를 수행
  • Young, Old 영역에 대해서 따로 region 이 나눠지지 않고 같이 사용된다. (i.e. old 영역이 GC 가 되면, 이 영역이 young 영역이 사용할 수 있다.)
  • Young GC
    • young 영역의 GC 는 parallel GC 이다.
  • Old GC
    • Old 영역의 GC 는 Old 영역의 일부 region 만 GC 가 일어난다. 이때 Young 영역의 GC 도 같이 일어날 수 있다.
  • GC 하는 방식은 CMS 와 유사하다.
  • Old 영역의 GC 는 필요에 따라서 모든 application 의 thread 를 멈추고 GC thread 와 동시에 실행될 수 있다.
  • CMS 와는 달리 Old 영역의 GC 는 Heap 사용량이 특정 threshold 값을 넘어가면 실행된다.
  • 유효한 객체들은 young, old GC 동안 live 영역으로 이동하는데, 이때 virtual memory address 로 이동하기 때문에

        객체들 사이에 비어있는 공간이 생기는 meory 파편화가 발생하지 않는다.

  • 전체 heap 에 대해서 GC 가 일어나지 않고 일부 region 에서만 하기 때문에 큰 heap 을 가질 경우 유리하다.

  • 사용자가 GC pause time 을 어떻게 목표로 하느냐에 따라 G1 은 young 영역과 전체 heap size 를 자동으로 조절한다.

  • Java Heap 이 많이 필요한 경우 G1 를 사용하는 것이 유리하다.

  • Parallel GC 와 CMS GC 의 절충안 정도의 GC algorithm 을 사용하기 때문에 준수한 throughput, latency 를 제공한다.