메모리를 명시적으로 해제하지 않아도 메모리 할당 받은 객체를 참조하는 부분이 없는 경우 Garbage Collector를 통해 자동으로 관리 해줌
- 사용한 객체를 null로 지정하지 않아도 됨
- System.gc() 를 호출하면 문제가 커짐 (필요 없는 상황에서 Full GC가 수행 됨...)
Stop-the-world : GC를 수행하기 위해 JVM이 Application을 멈추는 것 (GC를 수행하는 Thread 제외하고 모든 Thread의 작업을 멈춤)
- GC 튜닝이라는 것은 결국 Stop-the-world 시간을 줄이는 것인데, 이건 Major GC(Full GC)와 관련이 있음
Heap Memory에는 Young 영역과 Old 영역이 존재함
1. Young 영역
- 새로 생긴 객체가 위치함
- Eden(1), Survivor(2) 총 3개의 영역으로 존재함
- Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동 (Minor GC)
- Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 이동
- 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동 후 가득 찬 Survivor 영역은 비움
- 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동
2. Old 영역
- 오래된 객체가 위치함
- 데이터가 가득 차면 GC가 발생 (Major GC)
Garbage Collector 종류
1. Serial GC (-XX:+UseSerialGC)
- Mark-Sweep-Compaction 알고리즘 사용
- Old 영역에 살아 있는 객체를 식별(Mark)
- Heap 영역의 앞 부분부터 확인하여 살아 있는 것만 남김(Sweep)
- 각 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눔(Compaction)
2. Parallel GC (-XX:+UseParallelGC)
- Serial GC와 같은 알고리즘을 사용하지만 parallel 하게 수행 됨
- 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋음
3. Parallel Old GC (-XX:+UseParallelOldGC)
- Mark-Summary-Compaction 알고리즘 사용
- Summary 단계는 이전 GC의 Compaction 단계에서 살아남은 영역을 먼저 인덱싱 한 후 Sweep 단계를 수행(메모리를 조금 더 소모함)
4. CMS GC (-XX:+UseConcMarkSweepGC)
- Concurrent Mark and Sweep 알고리즘 사용
- ROOT set 에 의해 직접 참조되는 객체들을 Marking (Initial Mark)
- 애플리케이션 동작 중 작업하며 살아있는 객체 식별 (Concurrent Mark)
- 위에서 추가로 참조가 끊긴 객체를 확인 (Remark)
- 참조가 끊긴 모든 쓰레기 정리 (Concurrent Sweep)
- 모든 작업은 독립 쓰레드가 병렬로 처리
- Compaction 단계는 기본으론 제공하지 않음
- 조각난 메모리가 많아 Compaction 단계가 수행 되면 기존 보다 더 긴 Stop-the-world가 발생
5. G1 GC (-XX:+UseG1GC)
- Heap 영역을 작은 region으로 나누어 관리 (Young(Eden, Survivor) 영역과 Old 영역이 분리 되지 않음)
- -XX:MaxGCPauseMillis=value 를 통해 Stop-the-world 의 시간을 조절할 수 있음 (default:200ms)
- GC 동작 방식은 CMS GC 알고리즘과 같음
- 4GB 이상의 메모리를 사용할 경우에 사용해야 효율이 좋음
[참조]
https://d2.naver.com/helloworld/1329
https://www.slipp.net/wiki/pages/viewpage.action?pageId=26641949
'자바' 카테고리의 다른 글
ThreadLocal (0) | 2020.10.12 |
---|---|
JVM 메모리 구조 (0) | 2019.02.08 |