hanker

JAVA - JAVA에서 가비지 컬렉션(GC)이란 무엇일까? 본문

JAVA

JAVA - JAVA에서 가비지 컬렉션(GC)이란 무엇일까?

hanker 2024. 12. 2. 00:00
반응형

Java에서 가비지 컬렉션(Garbage Collection)은 더 이상 참조되지 않거나 사용되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수(Memory Leak)를 방지하고 효율적으로 메모리를 관리하는 기능이다.

 

이 과정은 JVM(Java Virtual Machine)에 의해 자동으로 수행되며, 프로그래머가 메모리 관리를 직접적으로 수행할 필요가 없다.

https://hanke-r.tistory.com/entry/JAVA-JDK-JRE-JVM%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

JAVA - JDK, JRE, JVM의 차이점은 무엇일까?

자바를 처음 접하다 보면 다양한 용어에 혼란을 느낄 수 있다. 특히 JDK, JRE, JVM이라는 용어는 자바 개발자라면 필수적으로 알아야 하지만 혼동하기 쉬운 개념들인데, 이 글에서 이 세 가지의 차

hanke-r.tistory.com

 


가비지 컬렉션의 주요 특징

 

 

자동 메모리 관리

- 프로그래머가 메모리를 수동으로 할당/해제하지 않아도 됨

- 객체가 더 이상 사용되지 않을 때, 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 알고리즘 및 힙 크기 조정을 고려해야 할 수 있다.

반응형