GC (Garbage Collector)에 대한 내용은 다음 글 참고.
https://billy727.tistory.com/83?category=1062896
JVM memory 구조
JVM이란? => Java Virtual Machine의 약자. JAVA와 OS 사이에서 중개자 역할 및 JAVA가 OS에 구애받지 않고 프로그램 실행시킬 수 있도록 도와주는 역할. Garbage Collector를 사용하여 메모리 관리도 자동으..
billy727.tistory.com
# GC가 일어나는 과정 (https://jonny-cho.github.io/java/2021/06/01/garbage-collection/ 참고)
1. 새로운 객체가 Eden 영역에 할당된다.
2. Eden 영역이 꽉 차면 Minor GC가 일어난다.
3. Marking 과정에서 살아남은 객체들은 Survivor0 영역으로 복사되고, .Eden 영역에 있는 데이터들을 삭제한다.
4. 다음 차례의 Minor GC에서는 Eden과 Survivor0 영역을 모두 mark하고 살아남은 객체들은 Survivor1 영역으로 복사되며, 이전 영역(Eden, Survivor0)의 데이터들을 삭제한다. 이때, 해당 객체의 Age 값이 증가됨.
5. 특정 Age에 도달한 객체들은 Old generation 영역으로 옮겨짐. (Young -> Old 를 promotion 현상이라 부름)
6. Old generation마저 데이터가 가득 차면 Major GC가 일어난다. (Full GC)
# STW (Stop The World)
- GC가 발생하면 JVM은 application을 멈추고 GC를 실행하는 thread만 동작하게 된다.
- STW 현상이 일어나면 application이 멈추기 때문에 장애로 이어질 수 있다.
# GC 종류
- GC는 JVM 버전에 따라 같이 발전되어 왔다. 따라서 버전 별로 지원하는 GC에 차이가 있으며, 서비스 상황에 따라 GC 방식을 JVM option을 통해 튜닝이 가능하다.
1. Serial GC
2. Parallel GC (Throughput Collector)
3. CMS GC (Concurrent Mark Sweep)
4. G1 GC (Garbage First)
1. Serial GC
- 주로 32 bit JVM에서 돌아가는 Single Thread 방식.
- 별도 지정하지 않으면 default GC 형태
- Minor GC 뿐만 아니라 Major GC인 경우도 STW를 하는 방식.
- 다른 GC에 비해 STW 시간이 김
- Mark-Compact algorithm 사용
2. Parallel GC
- JAVA 8의 default GC
- 64 bit JVM이나 멀티 CPU Unix 머신에서 기본 GC로 설정되어 있음.
- MinorGC와 Major GC 모두 Multi-Thread 사용.
- MinorGC와 MajorGC인 경우도 모두 STW 상태
- Serial GC에 비해 STW 시간 감소
3. CMS GC
- STW 시간이 많이 감소됨
- Initial Mark 과정에서 GC Root에서 참조하는 객체들만 식별
- CPU 리소스를 많이 사용하며, 메모리 파편화가 단점
4. G1 GC
- CMS GC를 개선한 버전
- JAVA 9 이상에서 default GC로 사용됨
- Heap을 일정한 크기의 Region으로 나눈 후, Region 단위로 탐색 (G1 collector는 young, old 영역 나누지 않음)
'JAVA > JAVA' 카테고리의 다른 글
JMX (0) | 2022.06.14 |
---|---|
request.getHeader의 ip 얻기 (0) | 2022.06.02 |
AlwaysPreTouch JVM option (0) | 2022.05.18 |
ClassLoader (0) | 2022.05.10 |
Thread dump (0) | 2022.03.25 |