티스토리 뷰
728x90
반응형
Garbage Collection이란?
Garbage Collector(GC)는 Heap 메모리에서 활동하며, JVM에서 GC의 스케줄링을 담당하여 개발자가 직접 관여하지 않아도 더이상 사용하지 않는 메모리를 제거해주는 역할을 담당합니다.
Person person = new Person();
person.setName("KDG");
person.setCity("seoul");
person = null;
// 가비지 발생
person = new Person();
person.setName("홍길동");
person.setCity("seoul");
GC는 간단하게 말하자면 Heap Area에서 더이상 사용하지 않는 메모리를 제거하는 것을 말합니다.
전통적인 Heap Area는 위의 사진에서 볼 수 있듯이 Eden, Survivor1, Survivor2, Old Generation으로 구분됩니다.
또한 Eden, Survivor1, Survivor2를 묶어서 Young Generation이라고도 부릅니다.
과정 예시
- Step 01 - 맨 처음 객체가 생성되면 Eden 영역에 생성이 됩니다. (Name이 KDG인 Person 객체 생성)
- Step 02 - GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다.
- * 여기서 Survivor 영역을 거치지 않고 바로 Old Generation 영역으로 이동하는 경우가 있는데 이 경우는 객체의 크기가 Survivor 영역의 크기보다 클 경우입니다.
- Step 03 - 아직 사용되는 것으로 판단되는 객체들은 Survivor1 또는 Survivor2 영역의 둘중 한 곳으로 넘어오게 됩니다. 이때 객체는 두 곳 모두에 존재할 수 없으며 다른 한 곳은 비워있어야 합니다.
- Step 04 - 위의 과정(1 ~ 3)을 반복하면서 Survivor 영역에서 계속 살아남는 객체들에게 일정 score가 누적되는데, 기준치를 넘어가게 되면 Old Generation 영역으로 이동하게 됩니다.
- Step 05 - Old Generation 영역에서 살아남았던 객체들이 일정 수준 이상 쌓이게 되면 미사용 된다고 식별된 객체들을 제거해주는 Full GC가 발생하게 됩니다.
- 이 과정에서 STW(Stop-The-World)가 발생하게 됩니다.
- STW란, Old Generation 영역에 쌓인 많은 객체들을 효율적으로 제거해주기 위해 JVM이 잠시 멈추는 현상을 뜻합니다.
Garbage Collection의 종류
- Serial GC
- Parallel GC
- Concurrent Mark-Sweep(CMS) GC
- G1(Garbage First) GC
Serial GC
- 하나의 CPU로 Young 영영과 Old 영역을 연속적으로 처리하는 방식입니다.
- 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 작동합니다.
- 싱글 스레드로 동작하여 느리고, 그만큼 STW 시간이 다른 GC에 비해 깁니다.
- Mark & Sweep & Compact 알고리즘을 사용합니다.
Parallel GC
- Java 8의 Default GC
- Young 영역의 GC를 멀티 스레드 방식을 사용하기 때문에 Serial GC에 비해 상대적으로 STW가 짧습니다.
Concurrent Mark Sweep GC(CMS GC)
- STW로 Application이 멈추는 현상을 줄이고자 만든 GC
- Reacable 한 객체를 한번에 찾지 않고 나눠서 찾는 방식을 사용합니다. (4 STEP으로 나누어짐)
- Initial Mark 단계
- Class Loader에서 가장 가까운 객체 중 살아 있는 객체만 찾는 것으로 끝납니다.
- STW가 발생하긴 하나 매우 짧습니다.
- Concurrent Mark 단계
- 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인합니다.
- 이 단계의 특징은 다른 스레드가 실행 중인 상태에서 동시에 진행합니다.
- Remark 단계
- Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체가 있는지 한번더 마킹하여 확인하는 과정입니다.
- STW 발생
- Concurrent Sweep 단계
- 쓰레기를 정리하는 작업을 실행합니다. 해당 작업도 다른 스레드가 실행되고 있는 상황에서 진행합니다.
위와 같이 진행하므로 Stop-The-World가 최대한 덜 발생하도록 하여 Java Application이 멈추는 현상을 줄입니다.
단점은?
- 다른 GC 방식보다 메모리와 CPU를 더 많이 먹는다.
Garbage First GC (G1 GC)
- Java 9 이상의 Default GC
- 현재 GC중 Stop-The-World의 시간이 제일 짧음
- CMS GC를 개선하여 만든 GC로 지금까지의 GC와는 다른 구조를 가집니다.
- Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리합니다.
- 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하며 각각의 Region에만 GC가 발생합니다.
728x90
반응형
'JAVA > JAVA기본' 카테고리의 다른 글
JAVA - 프리미티브 타입이란? (feat.레퍼런스 타입) (0) | 2021.12.08 |
---|---|
JAVA - 리플렉션 (Reflection)이란? (0) | 2021.11.28 |
JAVA - JVM이란 무엇인가 (0) | 2021.11.27 |
JAVA - 이미지 base64를 디코딩하여 파일 생성 후 DB에 디렉토리 저장 (0) | 2021.07.13 |
JAVA - 클래스 멤버(static)와 객체 멤버(인스턴스) (0) | 2021.06.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- pipe and filter architecture
- spring boot poi excel download
- transactional outbox pattern spring boot
- spring boot redisson destributed lock
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- java userThread와 DaemonThread
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot 엑셀 다운로드
- JDK Dynamic Proxy와 CGLIB의 차이
- pipeline architecture
- polling publisher spring boot
- @ControllerAdvice
- spring boot excel download oom
- spring boot redis 대기열 구현
- 서비스 기반 아키텍처
- spring boot redisson 분산락 구현
- service based architecture
- spring boot excel download paging
- redis 대기열 구현
- 람다 표현식
- redis sorted set으로 대기열 구현
- 자바 백엔드 개발자 추천 도서
- 레이어드 아키텍처란
- space based architecture
- java ThreadLocal
- redis sorted set
- 공간 기반 아키텍처
- spring boot redisson sorted set
- microkernel architecture
- transactional outbox pattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함