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 를 제공한다.
'Programming > Java' 카테고리의 다른 글
Java GC tuning (0) | 2016.10.18 |
---|---|
Functional Programming in Java Part2 - Java8 (0) | 2016.10.18 |
Functional Programming in Java Part1 - Java8 (0) | 2016.10.18 |
IntelliJ 를 사용하는 이유와 유용한 팁 모음 (14 버전 기준) (0) | 2015.12.02 |
unit test 가 아닌 것들 (0) | 2015.11.25 |