티스토리 뷰
Garbage Collection : Java Appliation에서 사용하지 않는 메모리를 자동으로 수거하는 기능. Java Appliation은 JVM(Java Virtual Machine)위에서 구동되는데, JVM의 기능 중 더이상 사용하지 않는 객체를 청소하여 메모리 공간을 확보하는 작업
(GC가 필요한 이유 : Heep 영역에 객체들이 계속 쌓이게 되면 OutOfMemoryException이 발생, 이를 방지하기 위해 주기적으로 사용하지 않는 객체를 수집하여 제거해줘함)
- Garcage Collector : 메모리가 부족할 때 쓰레기를 정리해주는 작업(Garbage Collection)을 수행하는 프로그램
ㄴ 하는 일 : 메모리 할당, 사용중인 메모리 인식, 사용하지 않는 메모리 인식
- 자바에서는 크게 두 영역(Young / Old)으로 메모리를 구분한다
- Young(New) 영역 : 자바 객체가 생성되자마자, 또는 생성된지 얼마 되지 않은 객체들을 저장되는 곳.
자바 객체가 생성되면 이 영역에서 저장 되다가 시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨짐
- Old 영역 : Young(New) 영역에서 저장되어 있던 객체 중, 오래된 객체가 이동되어서 저장되는 장소
(*Perm 영역 : Class나 Method 등의 코드가 저장되는 영역으로, JVM에 의해서 사용됨)
- Stop The World : 가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 일시 정지하는 것.
가비제 컬렉션이 실행되면 GC 작업을 맡은 스레드를 제외한 나머지 스레드는 모두 멈추게 되고 GC 작업이 종료되면 재개된다
Minor GC
- Young 영역에 대한 가비지 컬렉션을 Minor GC라 부른다. (Young 영역 중 Eden 영역이 꽉 차게되면 발생)
이 영역은 Eden / Survior 영역으로 또 나뉜다
ㄴ Eden : 자바 객체가 생성되자마자 저장되는 곳. 이렇게 생성된 객체는 Minor GC가 발생하면 Survivor영역으로 이동
ㄴ Survivor : Survivor1, Survivor2로 나뉨. Minor GC가 발생하면 Eden과 Survior1의 활성 객체를 Survivor2로 복사
- 활성이 아닌 객체는 자연스럽게 Survivor1에 남아있게 되고, Survivor1과 Eden영역을 클리어한다. 결과적으로 활성객체만 Survivor2로 이동하게 된 것
- 그 다음 Minor GC가 발생하게 되면 같은 원리로 Eden과 Survivor2 영역에서 활성객체를 Survivor1로 이동. 계속 같은 방식을 반복하여 Minor GC를 수행
- 이렇게 Minor GC를 수행하다 Survior영역에서 오래된 객체는 Old 영역으로 옮기게 된다.
- 이러한 방식의 GC 알고리즘을 Copy & Scavenge 라 한다
ㄴ Stop The World 방식
ㄴ 이 방식은 속도가 매우 빠르고, 작은 크기의 메모리를 콜렉팅하는데 매우 효과적
ㄴ Minor GC의 경우에는 자주 일어나기 때문에 GC에 걸리는 시간이 짧은 알고리즘을 사용하는게 적합
Major GC
- Old 영역이 가득차면 발생한다
- Minor GC 과정에서 삭제되지 않고, Old Generation영역으로 옮겨진 객체 중 미사용된다고 판단하는 객체를 삭제하는 GC
- 대표적으로 Mark & Sweep 알고리즘 사용
Full GC
- Heap 메모리 전체 영역에서 발생
- Old, Young 영역 모두에서 발생
- Minor GC, Major GC 모두 실패하거나 Young 영역과 Old 영역 모두 가득찼을때 발생
- Full GC에 사용되는 알고리즘을 Mark & Sweep & Compact라고 한다
ㄴ Mark & Sweep & Compact 알고리즘 :
1). 객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시(Mark)한다.
2). 1) 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 이 표시된 객체를 (Sweep) 한다
3). 메모리를 정리하여, 메모리 단편화를 해결할 수 있도록 한다.(Compact)
- Full GC는 속도가 매우 느리고, 일어나는 도중에 순각적으로 자바 애플리케이션이 멈춰버리기 때문에 성능과 안정성에 아주 큰 영향을 미친다( 멈추는 동안 사용자의 요청이 큐에 들어있다가, 순간적으로 요청이 한꺼번에 들어오기 때문에 과부하에 의한 여러 장애가 발생할 수 있음)
참고 :
'Java' 카테고리의 다른 글
[Java8] CompletableFuture-Concurrent 프로그래밍3. Callable과 Future (0) | 2021.12.08 |
---|---|
[Java8] CompletableFuture-Concurrent 프로그래밍2. Execurtors (0) | 2021.12.08 |
[Java8] CompletableFuture-Concurrent 프로그래밍1. 스레드 (0) | 2021.12.07 |
[Java8] Optional 소개 및 API (0) | 2021.07.18 |
[Java8] Stream API 예제 (0) | 2021.07.10 |
- Total
- Today
- Yesterday