TIL
TIL - 2024/09/23
기석김
2024. 9. 23. 23:42
자바 메모리 관리에 대해 봤다
프로세스와 쓰레드
프로세스: 자신만의 고유 공간과 자원을 할당받아 사용,
쓰레드: 다른 쓰레드와 공간과 자원을 공유하면서 사용
즉
프로세스 = 나, 독립적
쓰레드 = 공유
JVM의 동작 원리 ( JDK > JRE > JVM)
JVM은 Java 애플리케이션을 실행하기 위한 가상머신
- 클래스 로딩: JVM은 애플리케이션의 바이트코드(.class 파일)를 메모리에 로드
- 바이트코드 검증: 로드된 바이트코드를 검증하여 안전성을 보장
- 바이트코드 실행: JIT(Just-In-Time) 컴파일러가 바이트코드를 기계어로 변환하여 실행
- 메모리 관리: JVM은 힙(heap) 메모리를 관리하며, 객체 생성과 메모리 할당/해제를 처리
Java Heap 메모리
JVM Heap은 물리적으로 두 파트로 나뉨
1. Young 영역
2. Old 영역
Young은 말 그대로 젊은 객체 영역, 새로운 객체가 할당됨
만약 가득 찬다? 특수한 Young 컬렉션을 실행하여 가비지가 수집됨
Young에서 오랬동안 있었다? 그러면 Old로 이동됨
가비지 컬렉션은 마이너 GC라고 불린다
Young 영역은 3개의 부분으로 나뉨
Eden 메모리, 2개의 survivor 메모리
새로 생성되는 대부분의 객체는 Eden 메모리 영역에 위치함
Eden 영역이 객체로 차게 되면, 마이너 GC가 수행되어지고 살아남은 모든 객체는 Survivor 영역 중 하나로 이동함
Old가 가득 찬다? 가비지가 수집함 Old 컬렉션이라고 한다
Gc에 대해 좀 자세히 알아보자
GC(Garbage Collection)의 동작 방식
GC는 JVM에서 메모리를 관리하고 불필요한 객체를 정리하는 중요한 역할을 한다.
다양한 GC 알고리즘이 있으며, 각각의 동작 방식과 장단점이 있다
- Serial GC:
- 동작 방식: 단일 쓰레드로 GC 작업을 수행
- 장점: 구현이 간단하고, 단일 쓰레드 애플리케이션에 적합함
- 단점: 멀티코어 시스템에서 성능이 낮음. GC가 실행될 때 애플리케이션이 멈추는(stop-the-world) 시간이 김
- Parallel GC:
- 동작 방식: 여러 쓰레드를 사용하여 GC 작업을 병렬로 수행
- 장점: 멀티 코어 시스템에서 성능이 향상
- 단점: 여전히 stop-the-world 현상이 발생 가능
- CMS (Concurrent Mark-Sweep) GC:
- 동작 방식: 애플리케이션 쓰레드와 병행하여 GC 작업을 수행
- 장점: stop-the-world 시간을 축소
- 단점: 메모리 파편화(fragmentation)가 발생할 수 있으며, 복잡도가 높임
- G1 (Garbage-First) GC:
- 동작 방식: 힙을 여러 영역으로 나누어 병렬로 GC를 수행하며, 필요한 영역을 우선적으로 정리
- 장점: 예측 가능한 짧은 stop-the-world 시간을 제공
- 단점: 설정과 튜닝이 복잡할 수 있음.
⚙ JVM은 마치 큰 도서관과 같다.
도서관은 여러 책을 보관하고 대출하는 역할을 함.
책이 바로 메모리의 객체들이며, 책을 대출하고 반납하는 과정이 메모리 할당과 해제다.
- Serial GC는 한 명의 사서가 도서관의 모든 책을 관리하는 것과 같다. 사서가 모든 책을 정리하는 동안 도서관은 문을 닫아야 함
- Parallel GC는 여러 명의 사서가 함께 책을 정리하는 것과 같다.. 여러 사서가 동시에 작업하므로 도서관의 문을 닫는 시간이 짧아짐
- CMS GC는 사서들이 도서관을 운영하면서 동시에 책을 정리하는 것과 같다 도서관이 운영되는 동안에도 책을 정리할 수 있지만, 책이 제대로 정리되지 않아 공간이 어수선할 수 있음
- G1 GC는 사서들이 도서관을 여러 섹션으로 나누고, 가장 많이 대출되는 섹션을 우선적으로 정리하는 것과 같다 이렇게 하면 도서관이 항상 정돈된 상태를 유지할 수 있음