일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- db종류
- java
- 도커이미지
- JPA
- pat발급
- 르세라핌
- 오블완
- 11월순위
- git pat
- macvlan
- codeium
- git branch 삭제
- gtihub
- 자바
- docker
- ANTIFRAGILE
- 티스토리챌린지
- JPQL
- analytics4
- DBMS
- 애널리틱스4
- docker build
- spring
- 데이터내보내기
- 컬렉션프레임워크
- IntelliJ
- Python
- 명령어
- docker push
- Today
- Total
hanker
JAVA - JAVA에서 가비지 컬렉션(GC)이란 무엇일까? 본문
Java에서 가비지 컬렉션(Garbage Collection)은 더 이상 참조되지 않거나 사용되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수(Memory Leak)를 방지하고 효율적으로 메모리를 관리하는 기능이다.
이 과정은 JVM(Java Virtual Machine)에 의해 자동으로 수행되며, 프로그래머가 메모리 관리를 직접적으로 수행할 필요가 없다.
가비지 컬렉션의 주요 특징
자동 메모리 관리
- 프로그래머가 메모리를 수동으로 할당/해제하지 않아도 됨
- 객체가 더 이상 사용되지 않을 때, JVM이 이를 감지하고 메모리에서 제거
Heap 영역 관리: 가비지 컬렉션은 JVM의 Heap 메모리에서 동작하며, 힙은 다음과 같이 나뉜다.
- Young Generation: 새로 생성된 객체가 저장되는 영역
- Old Generation: Young 영역에서 오래 살아남은 객체가 이동되는 영역
- Permanent Generation(Metaspace): 클래스 메타데이터가 저장되는 영역(Java 7 이전 PermGen 사용 / Java 8 이후 Metaspace로 변경)
비동기적 수행
- GC는 JVM의 별도 스레드에서 실행되므로 프로그램이 실행되는 동안 백그라운드에서 수행됨
- 하지만 GC가 실행될 때 애플리케이션의 일부가 일시 중단되는 Stop-The-World 현상이 발생할 수 있음
* Heap 영역 관리에 대해서 좀 더 쉽게 설명하자면,
Young Generation 은 새로 산 물건을 임시로 놓아두는 탁자
Old Generation 은 오랫동안 사용하는 물건을 보관하는 서랍장
Metaspace 는 물건의 설명서와 관련 정보를 보관하는 책장
으로 이해하면 좀 쉬울 것 같다.
가비지 컬렉션의 동작 원리
1. 객체의 생존 여부 판단
- GC는 객체가 여전히 활성 참조를 가지고 있는지 판단하여 객체의 생존 여부를 결정.
- 참조를 확인하는 방법으로는 참조 그래프(Reference Graph), Root 객체 탐색이 있다.
2. GC의 알고리즘
- Mark-and-Sweep: 살아있는 객체를 식별(Mark)한 후, 도달할 수 없는 객체를 제거(Sweep)
- Copying: 살아있는 객체를 복사하여 메모리의 단편화를 방지
- Generational GC:객체의 생애주기(짧음/김)에 따라 Young, Old 영역을 분리하여 효율적으로 관리
3. GC의 단계
- Minor GC: Young Generation 영역에서 수행
- Major GC (또는 Full GC): Old Generation 및 Young Generation 전체에서 수행
GC 장점과 단점
장점
- 프로그래머가 직접 메모리를 관리하지 않아도 되므로 개발 생산성과 안정성이 향상된다.
- 메모리 누수와 같은 버그를 방지하는 데 도움이 된다.
단점
- GC가 실행되는 동안 성능 저하가 발생할 수 있음
- 특정 시점에 메모리를 수집하므로, 프로그래머가 메모리 해제 시점을 정확히 제어할 수 없음
- 대규모 애플리케이션에서는 GC 튜닝이 필요
가비지 컬렉션 튜닝
효율적인 GC 수행을 위해 JVM의 설정을 조정할 수 있다.
GC 알고리즘 선택: JVM 옵션을 통해 GC 방식을 설정.
예: -XX:+UseG1GC (G1 GC 사용), -XX:+UseParallelGC (병렬 GC 사용)
Heap 크기 조정: -Xms (초기 힙 크기), -Xmx (최대 힙 크기)
결론
가비지 컬렉션은 Java의 핵심적인 메모리 관리 기능으로, 메모리 누수를 방지하고 프로그래머의 부담을 줄여주는 중요한 역할을 한다.
하지만 성능 최적화를 위해 GC 알고리즘 및 힙 크기 조정을 고려해야 할 수 있다.
'JAVA' 카테고리의 다른 글
JAVA - JAVA에서 쓰레드란 무엇이며, 어떻게 생성할까? (0) | 2024.12.03 |
---|---|
JAVA - JAVA에서 제네릭이란 무엇일까? (0) | 2024.12.01 |
JAVA - JAVA에서 접근 제어자란 무엇일까? (public / private / protected / default) (1) | 2024.11.30 |
JAVA - JAVA에서 컬렉션 프레임워크란 무엇일까? (0) | 2024.11.28 |
JAVA - JAVA에서 메서드 오버로딩과 오버라이딩의 차이점은 무엇일까? (0) | 2024.11.27 |