2022.01.14 - [Language/Java] - [JAVA] Gabage Collection (1)🗑️
이전 포스팅에서는 GC가 어떻게 사용하지 않는 메모리를 판별하는 참조 방식과 청소 방식에 대해서 알아보았다.
그렇다면 이 방식과 방식을 JVM Heap영역에 대입해서 동작하도록 해야한다.
# heap 메모리의 구조 & GC 종류
JVM의 Heap 메모리 영역은 애초에 설계될때 2가지 전제로 설계되었다.
- 대부분의 객체는 빨리 Unreachable된다.
- 오래된 객체에서 새로운 객체의 참조는 아주 적게 존재한다.
즉, 이 두가지 전제가 관통하는 바는 객체는 일회성이며, 메모리에 오랫동안 남아있는 경우가 드물다 는 전제로 설계가 되었다는 것이다.
이러한 특성으로 Heap영역에서 2가지 영역으로 세분화 하였다.
- young Generation
- 새롭게 생성된 객체가 할당되는 영역
- 대부분의 객체가 금방 unreachable 되기 때문에, 대게 youg영역에서 생성되었다가 사라진다.
- Minor GC가 이루어진다.
- old Generation
- young영역에서 Reachable상태를 유지하여 살아남은 객체가 복사되는 영역
- young영역보다 크며 GC가 적제 발생
- Major GC 발생
Young영역을 효율적으로 관리하기 위해 세분화 한다.
- Eden: 가득 차면 MinorGC가 발생
- Survival0: Survival1과 스왑하면서 reachable 객체 저장
- Survival1: : Survival0과 스왑하면서 reachable 객체 저장
- age: survival 영역에서 살아남는다면 +1씩 증가
임계치 도달시(거의 6bit이기 때문에 31) old영역으로 이동 ➡️ Promotion
OldGen영역이 꽉차면 Major GC가 발생한다. Major GC는 Eden영역보다 훨씬 커서 오래 걸리게 된다. 그게 우리가 처음에 말한 STW이다.
# JVM의 GC 알고리즘 및 종류
자바는 매니지드언어로써 JVM에서 메모리를 자동으로 관리해준다.
저번 포스팅에서 이야기한 것처럼 개발자가 개발에 집중을 할 수 있도록 지원해준다.
- Serial Garbage Collector
- 디바이스 성능이 안좋은 경우
- Parallel Garbage Collector
- Java 8의 default GC
- MinorGC 멀티스레드 실행
- G1 Garbage Collector
- Java 9+의 default GC
- 기존의 메모리 영역 분리가 아닌 Region으로 새롭게 설정하여 동적으로 역할을 부여
- Z Garbage Collector
- Java 15에 default GC
- Zpage라는 영역을 사용
- STW가 10ms가 넘지 않음
https://www.baeldung.com/jvm-garbage-collectors
공식문서에 따르면 위 4가지를 지원하게 된다.
반응형
'Language > Java' 카테고리의 다른 글
[JAVA] Error VS. Exception (0) | 2024.04.09 |
---|---|
[JAVA] 컴파일 과정 (0) | 2024.04.09 |
[JAVA] Gabage Collection (1)🗑️ (1) | 2024.04.09 |
[JAVA] 상속 👨👩👧👦 (2) | 2023.09.12 |
[JAVA] JVM 메모리 구조 (0) | 2023.09.12 |