JVM(Java Virtual Machine)
- 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
- 역할 : 메모리 관리, Garbage Collector를 수행
Garbage Collector
- 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
Stack: 정적으로 할당한 메모리 영역
원시 타입의 데이터가 값과 함께 할당. Heap영역에 생선된 Object 타입의 데이터의 참조 값 할당.
Heap: 동적으로 할당한 메모리 영역
모든 Object 타입의 데이터가 할당. Heap영역의 Object를 가르키는 참조 변수가 Stcak에 할당.
- 메인 매서드가 끝나게 되면 Stack 영역에 있는 데이터가 날라가고, Heap 영역에 객체타입의 데이터만 남는데 이러한 객체를 Unreachable Object라 하고, 이것들이 Garbage Collector 의 대상이 됨
Garbage Collector 과정
1.Garbage Collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
2.Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다. => 이러한 과정을 객체를 찾아서 마킹하는 과정이라서 Mark
3. 마킹되지 않은 객체를 Heap에서 제거한다. => 이러한 과정을 쓸어내린다고 해서 Sweep
Garbage Collection은 언제 일어날까?
- 새로운 객체는 Eden 영역에 할당된다.
- Eden 영역이 꽉차게 되면 GC 발생(Minor)
- Eden 영억의 Reachable 객체는 Survival0 으로 옮겨진다.
Eden 영역의 Unreachable 객체는 메모리에서 해제
- Survival 0의 영역에서 살아남은 객체들은 Survival1 영역으로 이동되는데, 이동한 객체는 Age 값 증가
- 결정적으로 Survival0, Survival1 영역은 둘중 하나는 항상 비워진 상태로 유지가 된다.
- Survival1 영역이 또 꽉 차게 되면 GC가 발생해서 Survival0 영역으로 이동, 이동한 객체는 Age 값 증가
- Age 값이 계속 증가하다가, 특정 값 이상이 되면 Old Generation 영역으로 옮겨진다. 이 과정을 Promotion 이라고 한다.
- Old Generation 영역이 꽉차게 되면 또 GC가 발생하는데 이 때 발생한 GC를 Major GC라고 함
지금까지의 과정이 반복되면서 Garbage Collection가 메모리를 관리한다.
Garbage Collection 종류
1. Serial GC
- GC를 처리하는 스레드가 1개이다.
- CPU 코어가 1개만 있을 때 사용하는 방식
- Mark-Compact Collection 알고리즘
2. Parallel GC
- GC를 처리하는 스레드가 여러 개 이다.
- Serial GC보다 빠르게 객체를 처리할 수 있다.
- Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.
3. Concurrent Mark Sweep GC
- Stop-The-World 시간이 짧다.
- 애플리케이션의 응답 시간이 빨라야 할 때 CMS GC를 사용한다.
- 다른 GC방식보다 메모리와 CPU를 더 많이 사용한다.
- Compaction 압축되는 단계가 제공되지 않는다.
))Stop-The-World
- GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
- stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.
- GC 작업을 완료한 이후에 중단한 작업을 다시 시작한다.
- Initial Mark 과정에서 GC과정 중 1번째 과정을 수행한다.
- Concurrent Mark 과정에서 다른 애플리케이션 스레드와 동시에 수행되면서 이니셜 마크에서 마킹을 해뒀던 객체를 어떠한 객체를 참조하고 있는지 객체그래프를 타고 가면서 계속해서 마킹하는 과정
- Remark 과정에서 살릴건 살리고 죽일건 죽이는 과정
- Cocurrent Sweep에서 다른 애플리케이션 스레드와 동시에 수행되면서 데이터드를 해제하는것
4. G1 GC
- 각 영역을 Region 영역으로 나눈다.
- GC가 일어날 때, 전체 영역(Eden, Survival,Old generation) 을 탐색하지 않는다.
- G1.GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.
그러다가 해당 영역이 꽉 차면 다른 빈 영역에 객체를 할당하고 GC를 실행한다.
- G1.GC는 STW 시간이 짧다.
- Compaction을 사용한다.
자료: https://www.youtube.com/watch?v=vZRmCbl871I
'개발자노트 > 우아한 테코톡 감상' 카테고리의 다른 글
[10분 테코톡] 우아한테크코스 제리의 MVC패턴 (0) | 2022.07.07 |
---|---|
[10분 테코톡] 우아한테크코스 루피의 도서관리시스템 (0) | 2022.07.07 |
우아한Tech [10분 테코톡] 시간 복잡도 (0) | 2022.06.12 |
우아한Tech [10분 테코톡] 빌드와 배포 (0) | 2022.06.12 |
우아한Tech [10분 테코톡] 빌드 용어 영상 (0) | 2022.06.12 |