-
자바의 GC 가비지 콜렉션 알고리즘프로그래밍/자바 2019. 5. 22. 13:53
가비지 콜렉션 GC 알고리즘
이번 면접에서 제대로 답하지 못한 몇가지 질문들 중 하나인 Java의 GC에 대해 정리해보자.
가비지콜렉션이란 자바에서 개발자가 따로 메모리를 해제할 필요없이 힙 영역에서 더이상 사용되지 않을 객체들(쓰레기 객체) 를 찾아 메모리를 해제하여 메모리를 자동으로 정리해주는 것을 말한다.
이러한 GC가 발생할 때에는
stop the world
라는 현상이 나타나는데 이는, GC를 실행하기 위해 다른 모든 쓰레드의 작업을 정지시키는 것을 말한다. 어떠한 알고리즘을 사용하더라도stop the world
는 발생할 수 밖에 없지만, 더 나은 알고리즘을 사용하여stop the world
시간을 최소화하는 것이 중요하다.자바의 힙영역은 두가지 영역으로 나뉜다.
Young (New) 영역 : 말그대로 새롭게 생성된 객체의 대부분이 위치, Young 영역에서 발생하는 GC를
마이너 GC
라고 부름.Old 영역 : Young 영역에서 살아남은 객체가 이동되는 곳, 대부분 Young 영역보다 크기가 더 크게 설정되어 GC가 더 적게 발생한다고 함. 이 곳에서 발생하는 GC를
메이저 GC
라고 부름.
GC 알고리즘
Serial GC
Old영역에서
mark-sweep-compact
라는 알고리즘을 사용- Old영역에 살아있는 객체 마킹 mark
- 힙의 앞부분부터 확인하여 살아있는 것들만 남기고 sweep
- 마지막으로 힙의 앞부분부터 채워서 객체가 없는 부분과 있는 부분을 나눔 compact
적은 메모리와 CPU코어가 적을 때 적합하여, 32비트 윈도우나 싱글 프로세서 머신에서 주로 사용된다.
Parallel GC ( Throughput GC )
- 위의 serial GC와 거의 같지만, 병렬처리를 지원하여 더 빠르게 객체를 처리할 수 있음
- 메모리가 크고, 코어의 갯수가 많을 때 유리
CMS GC ( Low Latency GC )
- 시리얼 GC와는 다르게 마크를 세번에 나눠한다.
- Initial Mark -> Concurrent Mark -> Remark -> Concurrent Sweep
- ConcurrentMark 와 Concurrent Sweep은 다른 스레드가 실행되는 와중에 작업이 진행되기 때문에 CMS GC는
stop the world
타임이 짧다.
- 다른 방식보다 메모리와 CPU를 많이 사용하기 때문에 신중히 검토 후 적용해야한다.
G1 GC
- JDK 7에서 정식으로 포함하여 제공
- CMS를 대체하기 위해 만들어짐.
- 힙을 여러 영역으로 나누어서 GC한다.
- Young 영역은 여러개로 나누어 다른 콜렉터와 동일하게 다른 쓰레드를 정지하고 GC한다.
- Old 영역은 백그라운드 쓰레드로 작동하여, 다른 쓰레드를 정지시키지 않고 GC한다.
- 사용을 위해선 jvm에 별도로 옵션을 설정해야한다(-XX:+UseG1GC)