728x90
2021.11.10 Java Study
// Stop-the-world
- GC을 실행하기 위해 JVM이 애플리케이션 실행을 정지
- stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈추고 GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작
GC(Garbage Collection) ?
- 메모리 관리 기법 중 하나
- 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제
Young, Old 영역
1. Young 영역 ( Young Generation )
- 새롭게 생성된 객체의 대부분이 위치
- 대부분의 객체가 금방 접근 가능 상태가 되기 때문에 많은 객체가 Young 영역에서 생성되었다 사라짐
- Minor GC가 발생
2. Old 영역 ( Old Generation )
- 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사됨
- 대부분 Young영역보다 크게 할당되며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생
- Major GC(or Full FC)가 발생한다.
3. Minor GC와 Major GC의 동작 과정
// Young 영역에 대한 GC
- 객체가 새롭게 생성되면 eden 영역에 메모리가 할당된다.
- eden 영역이 가득하면 minor gc가 동작. eden영역의 객체 중 살아있는 객체는 survivor0 영역으로 복사되고, eden영역의 메모리는 비워진다.
- 다시 eden 영역이 가득차면 minor gc가 동작되고, eden영역과 survivor0영역의 객체중 살아있는 객체는 survivor1 영역으로 복사되고, eden영역은 비워진다.
- eden 영역이 가득찰 때마다 survivor0, 1를 옮겨가며 minor gc가 반복된다.
- survivor 영역을 이동하는 이유는 메모리 단편화를 방지하기 위해서이며, 살아남은 횟수는 age bit에 기록되고 threshold를 넘기거나 survivor영역의 메모리가 부족해지는 경우 old영역으로 이동
// Old 영역에 대한 GC
- Serial GC → mark-sweep-compact 알고리즘 사용, 메모리가 적고 코어 수가 적을 때 적합
- mark 단계: old영역에서 살아있는 객체를 확인
- sweep 단계: heap영역의 앞부분부터 확인하여 표시된 객체를 제거
- compact 단계: 메모리 단편화를 방지하기위해 힙의 앞부분부터 객체를 채워 넣음
- Parallel GC
- Serial GC와 동작과정은 동일하지만, minor gc에서 사용되는 Thread의 수를 늘릴 수 있다.
- java 8 버전에서는 기본값으로 사용
- 메모리가 충분하고 코어 수가 많을 때 효과적
- CMS GC
- stop-the-world 시간이 매우 짧다.
- 모든 애플리케이션의 응답 속도가 매우 중요할 때 CMS GC를 사용하며, Low Latency GC로 불린다.
- Initial Mark 단계: 클래스 로더에서 가장 가까운 객체 중 살아있는 객체만 찾는 것으로 끝낸다.
- Concurrent Mark 단계: 새로 추가되거나 참조가 끊긴 객체를 확인한다.
- Concurrent Sweep 단계: 쓰레드를 정리한다. 이 작업도 다른 스레드가 실행되고 있는 상황에서 진행한다.
- 단점
- 다른 GC방식보다 메모리와 CPU 사용률이 높다.
- Compaction 단계가 기본적으로 제공되지 않는다. → 메모리 파편화 발생
- G1 GC (Garbage First GC)
- 이전의 Young 영역과 Old 영역과는 다르다
- 바둑판의 각 영역에 객체를 할당하고 GC를 실행시키고 해당 영역이 꽉차면 다른 영역에서 객체를 할당하고 GC를 실행한다.
- 즉, Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC방식이다.
- 지금까지의 설명한 GC 방식 중 가장 빠르다.
- JDK 6 에선 시험삼아 사용할 수 있도록 했지만, JDK 7부터 정식 제공했다.
- Heap 영역이 매우 큰 머신(최소 4GB)에서 돌리기 적합하다.
- CMS GC 와 같은점
- Young Generation 영역은 Multi Thread로 정리한다
- Old Generation 영역의 여러개 Region를 Background Thread로 정리한다.
- CMS와 차이점
- 중간중간 쓸모없는 객체들을 정리하는게 아니라 Region을 통째로 정리한다.
- 참조가 없는 객체들은 지우고 사용 중인 객체는 다른 Region으로 복사한다.
- 다른 Region으로 복사하는 과정에서 Compacting(압축)이 되므로 메모리 파편화 현상이 생기지 않는다.
-Reference
https://jgrammer.tistory.com/143
'자바 스터디' 카테고리의 다른 글
Generic, Raw Type, Generic Type Eraser (0) | 2021.11.24 |
---|---|
리플렉션(Reflection) ? (0) | 2021.11.17 |
자바의 컴파일 과정과 JVM에서 HEAP의 변화 (0) | 2021.11.03 |
JVM( Java Virtual Machine ) 이란 (0) | 2021.10.27 |
[Java] JVM과 자바의 버전별 변화 (0) | 2021.10.25 |